2016-04-09 16 views
0

Ich verwende einen SOAP-Webservice von unserem Ticketsystem OTRS. Der Webservice steht also nicht wirklich unter meiner Kontrolle. Die Anfrage funktioniert gut, aber ich bekomme nie eine Antwort in meinem Code. Die Antwort ist immer null. (var response = client.SessionCreate(session);) Das seltsame Ding ist, dass wireshark und die Webservice-Konsole dieses Ticketsystems sagen, dass ich eine gültige Antwort erhalten sollte. Da ich sehr neu in diesem Webservice bin, habe ich absolut keine Ahnung, wo ich in diesem Fall anfangen soll. Also hier ist eine Beschreibung von dem, was ich getan habe. Jeder Vorschlag wird sehr geschätzt.WCF Webservice gibt immer null zurück

Zuerst erstellte ich ein normales C# -Projekt und fügte die WSDL-Datei hinzu, die nur auf der GitHub-Website des OTRS-Projekts zu finden ist. Ich habe es als Service-Referenz hinzugefügt und dann meinen C# -Code hinzugefügt, der so aussieht.

// Für Debug System.Net.ServicePointManager.Expect100Continue = false; Thread.CurrentThread.CurrentUICulture = new CultureInfo ("en-us");

try 
{ 
    OTRS.OTRS_Error err = new OTRS.OTRS_Error(); 
    OTRS.GenericTicketConnector_PortTypeClient client = new OTRS.GenericTicketConnector_PortTypeClient("GenericTicketConnector_Port"); 

    OTRS.SessionCreate session = new OTRS.SessionCreate(); 
    session.Item = "someUserNameGoesHere"; 
    session.ItemElementName = OTRS.ItemChoiceType8.UserLogin; 
    session.Password = "SomePasswordGoesHere"; 

    var response = client.SessionCreate(session); 

    Console.WriteLine(response.SessionID); 
    Console.WriteLine(response.Error); 
} 
catch (Exception exep) 
{ 
    Console.WriteLine(exep.Message); 
    Console.WriteLine(exep.InnerException); 
} 
finally 
{ 
    Console.ReadLine(); 
} 

Eingehende Nachricht an server

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing"> 
<s:Header> 
    <a:Action s:mustUnderstand="1">http://www.otrs.org/TicketConnector/SessionCreate</a:Action> 
    <a:MessageID>urn:uuid:14750529-3de2-4618-8db4-8ac18b681c18</a:MessageID> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    <a:To s:mustUnderstand="1">http://SomeServer/otrs/nph-genericinterface.pl/Webservice/GenericTicketConnector</a:To> 
</s:Header> 
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <SessionCreate xmlns="http://www.otrs.org/TicketConnector/"> 
     <UserLogin xmlns="">someUserName</UserLogin> 
     <Password xmlns="">somePassword</Password> 
    </SessionCreate> 
</s:Body> 

Abgehende Nachricht an server

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding" 
xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
     <SessionCreateResponse xmlns="http://www.otrs.org/TicketConnector/"> 
      <SessionID>SomeSessionID</SessionID> 
     </SessionCreateResponse> 
    </soap:Body> 
</soap:Envelope> 

Wireshark HTTP/XML-Paket vom Server zu meinen Klienten geht

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding" 
xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
     <SessionCreateResponse xmlns="http://www.otrs.org/TicketConnector/"> 
      <SessionID>SomeSessionID</SessionID> 
     </SessionCreateResponse> 
    </soap:Body> 
</soap:Envelope> 

Refernce.cs https://gist.github.com/HansVader/1ba3847d918ee15ef16703c8ada6c9bf

WSDL https://gist.github.com/HansVader/dd849e49f4a1584397cd21b0e430b301

ich zur Zeit nur die SessionnCreate und TicketUpdate Funktion benötigen. Die anderen Operationen sind zu diesem Zeitpunkt irrelevant. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Update:

Hier sind die Spuren aus dem Trace-Tool wie yildizm85 vorgeschlagen in den Kommentaren: Outgoing SOAP message

Incoming SOAP message

Ich denke, es ist auch erwähnenswert, dass ich die refernce.cs erstellt durch Ich selbst mit dem svcutil Werkzeug, weil ich ein Problem mit dem IsWrapped hatte. Werfen Sie einen Blick auf diese Frage und Antwort: XmlSerializer attribute not valid in Web Service using WCF

+0

Haben Sie die WCF-Ablaufverfolgung versucht? https://msdn.microsoft.com/en-us/library/ms751526.aspx –

+0

Es sieht aus wie die Nachricht, die Sie senden, ist korrekt, und die Nachricht, die Sie zurück erhalten. Ich habe die Namespaces ein wenig überprüft und es sieht auf den ersten Blick gut aus. Die Deserialisierung scheint jedoch nicht zu funktionieren, daher wird wahrscheinlich etwas aus der WSDL falsch generiert oder die WSDL ist falsch. Haben Sie versucht, die Service-Referenz mehrmals hinzuzufügen (Hinzufügen und Löschen) oder etwas in Referenz.cs geändert? – Cosmin

+0

Ich schlage vor, Sie betrachten ServiceStack.net - wirklich gute Web-Service-Bibliothek. Sie haben eine ältere Open-Source-Version am Ende ihrer Download-Seite. –

Antwort

1

Die WSDL nicht ElementFormDefault- definieren:

<xsd:schema targetNamespace="http://www.otrs.org/TicketConnector/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

Da unqualifizierte Standard ist, verursacht dies jede Eigenschaft mit Formular = System.Xml.Schema werden eingerichtet. XmlSchemaForm.Unqualified in der generierten Referenzdatei.

Da jedoch für jedes komplexe Objekt ein Standardnamespace angegeben ist, verarbeitet der XML-Serializer die nicht qualifizierten Eigenschaften nicht.

Die Lösung

Ändern Sie das Schema-Element auf:

<xsd:schema targetNamespace="http://www.otrs.org/TicketConnector/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

Auch für einige der Eigenschaften, ist die Reihenfolge falsch, so müssen sie (zum Beispiel TickerCreateResponse) geändert werden :

<xsd:element name="TicketCreateResponse"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element maxOccurs="1" minOccurs="1" name="ArticleID" type="xsd:positiveInteger"/> 
      <xsd:element maxOccurs="1" minOccurs="1" name="TicketID" type="xsd:positiveInteger"/> 
      <xsd:element minOccurs="1" name="TicketNumber" type="xsd:string"/> 
      <xsd:element maxOccurs="1" minOccurs="0" name="Error" type="tns:OTRS_Error"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

Nach diesen Änderungen den Proxy mit svcutil erstellen:

svcutil.exe/Serializer: XmlSerializer GenericTicketConnectorSOAP.wsdl /o:OtrsConnector.cs/umhüllter/n: *, OTRS

Und mit der config:

<system.serviceModel> 
<bindings> 
    <customBinding> 
    <binding name="GenericTicketConnector_Binding"> 
     <textMessageEncoding messageVersion="Soap12" writeEncoding="utf-8" /> 
     <httpTransport /> 
    </binding> 
    </customBinding> 
</bindings> 
<client> 
    <endpoint address="http://localhost/otrs/nph-genericinterface.pl/Webservice/GenericTicketConnector" 
    binding="customBinding" bindingConfiguration="GenericTicketConnector_Binding" 
    contract="otrs.GenericTicketConnector_PortType" name="GenericTicketConnector_Port" /> 
</client> 
</system.serviceModel> 

Es sollte danach arbeiten, bei Wenigstens hat es für mich getan.

Hoffe es funktioniert auch für Sie!

Verwandte Themen