2010-09-24 14 views
10

Dies ist mein erster Versuch, WCF zu verwenden, also rate ich, dass ich etwas falsch mache. Ich versuche, einen von der WSDL definierten Soap-Service unter http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1?wsdl zu erreichen. Ich benutze VS2010, und ich füge eine Service-Referenz zu meinem Projekt hinzu und weise sie auf die URL dort (oder vielmehr unsere Intranet-Installation davon) Wenn ich den Objektbrowser zum Anzeigen des Service verwende, sind die Operationen an der Schnittstelle ALL void-Methoden ohne Parameter. Es scheint, dass WCF die Typinformation nicht korrekt liest. Dabei spielt es keine Fehler geben, aber es ist jede Menge Warnungen wie die folgende Angabe:WCF-Dienstverweis generiert void-Methoden von WSDL

Warnung 1 Anpassungs-Tool Warnung: Fehler namens InvalidSessionException in Betrieb GetPermissions nicht importiert werden. Nicht unterstützter WSDL, der Fehler Nachrichtenteil muss auf ein Element verweisen. In dieser Fehlermeldung wird nicht auf ein Element Bezug genommen . Wenn Sie Zugriff auf das WSDL-Dokument bearbeiten, können Sie das Problem beheben, indem Sie auf ein -Schema-Element verweisen, das das "Element" Attribut verwendet. Z: \ TestLibrary \ Service Referenzen \ Confluence \ Reference.svcmap 1 1 TestLibrary

Warnung 2 Warnung Anpassungs-Tool: Das optional WSDL Verlängerungselement 'body' von Namespace 'http://schemas.xmlsoap.org/wsdl/soap/' wurde nicht behandelt. XPath: // wsdl: definitionen [@ targetNamespace = 'http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1']/wsdl: binding [@ name = 'confluencieservice-v1SoapBinding']/wsdl: operation [@ name = 'getPermissions']/wsdl: input [@ name = 'getPermissionsRequest'] Z: \ TestLibrary \ Service Referenzen \ Confluence \ Reference.svcmap 1 1 TestLibrary

Was mache ich falsch? Ich habe versucht, die Konfiguration des Dienstes mit einer Kombination von Optionen zu ändern, aber ich konnte niemals die Typen aus der WSDL richtig einholen. Ich habe davon ausgegangen, dass WCF die Typklassen zusammen mit der Service-Schnittstelle automatisch generieren wird. Soll ich herausfinden, welche Typen in der WSDL verwendet werden, und die Klassen und Datenverträge selbst erstellen, oder ist es etwas anderes?

Antwort

5

Hhmm ... interessant - ich lief svcutil.exe von der Kommandozeile gegen diese URL zur Verfügung gestellt, und während ich eine Tonne von Warnungen über WSDL Probleme bekommen, ich erhalte auch einige Codes - so etwas wie:

//------------------------------------------------------------------------------ 
// <auto-generated> 
//  This code was generated by a tool. 
//  Runtime Version:2.0.50727.4952 
// 
//  Changes to this file may cause incorrect behavior and will be lost if 
//  the code is regenerated. 
// </auto-generated> 
//------------------------------------------------------------------------------ 

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(Namespace="http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1", ConfigurationName="ConfluenceSoapService")] 
public interface ConfluenceSoapService 
{ 
    // CODEGEN: Generating message contract since the wrapper namespace (http://soap.rpc.confluence.atlassian.com) of message getPermissionsRequest does not match the default value (http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1) 
    [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, Use=System.ServiceModel.OperationFormatUse.Encoded)] 
    getPermissionsResponse getPermissions(getPermissionsRequest request); 

    // CODEGEN: Generating message contract since the wrapper namespace (http://soap.rpc.confluence.atlassian.com) of message searchRequest does not match the default value (http://confluence.atlassian.com/rpc/soap-axis/confluenceservice-v1) 
    [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, Use=System.ServiceModel.OperationFormatUse.Encoded)] 
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteException))] 
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(Vector))] 
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemotePermission))] 
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteNodeStatus))] 
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemotePageHistory))] 
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteContentPermission))] 
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(AbstractRemotePageSummary))] 
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteSpaceSummary))] 
    [System.ServiceModel.ServiceKnownTypeAttribute(typeof(RemoteSearchResult))] 
    searchResponse search(searchRequest request); 

Ich würde also versuchen, svcutil.exe von der Befehlszeile zu verwenden, um Ihre Datei zu generieren und dann verwenden, um mit Ihrem Confluence-Dienst zu sprechen.

+1

+1 für das Vorschlagen von svcutil.exe. – Bernard

+0

Hmm ... es scheint mit svcutil.exe zu arbeiten. Das ist wirklich merkwürdig. Trotzdem danke. – StarKat99

+0

Auch für mich, wenn Sie unter Visual Studio Startmenü gehen gibt es eine Kurzzeichen für die VS-Eingabeaufforderung, die Svcutil leicht zugänglich macht, dann: 'svcutil.exe http: // Somedomain.com/someapi.wsdl' – AaronLS

0

Gerade dieses Problem auf JIRA 4.4 aufgetreten, und es funktioniert, wenn Sie die ältere Web-Referenz anstelle einer Service-Referenz verwenden.

Für Anleitungen hierzu finden Sie unter: Web Reference vs. Service Reference

Dies ist die einfachste Lösung für mich war, da ich weiß, ist JIRA zu REST bewegt (weg von SOAP) und ich versuche nur schnell aufstehen und laufen.