2016-04-09 31 views
0

を返します。だからWebサービスは私のコントロール下にありません。 要求は正常に機能しますが、私はコードで決して答えを得ていません。答えは常にnullです。 (var response = client.SessionCreate(session);) 奇妙なことは、そのチケットシステムのwiresharkとwebserviceコンソールが、有効な回答を受け取るべきだと言っていることです。 私はこのwebserviceのものにはとても新しいので、私はこの場合どこから始めるのか全く考えていません。ここに私がしたことの説明があります。どんな提案も本当に感謝しています。WCF Webサービスは、常に私たちのチケットシステムのOTRSからのSOAP Webサービスを消費していますヌル

まず私は、通常のC#プロジェクトを作成しただけOTRSプロジェクトのGitHubのサイトのウェブサイト上で見つけることができますWSDLファイルを追加しました。私はそれをサービスリファレンスとして追加し、C#コードを追加しました。

//デバッグ System.Net.ServicePointManager.Expect100Continueのために=偽; 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(); 
} 

受信メッセージ

<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> 

サーバーサイドで

送信メッセージ

<?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パッケージ

<?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

私は現在、唯一のSessionnCreateとTicketUpdate機能を必要としています。他の操作は、この時点では無関係です。他の情報が必要な場合はお知らせください。

アップデート:ここで

があるyildizm85のようなトレースツールからのトレースはコメントで示唆: Outgoing SOAP message

Incoming SOAP message

私はそれはまた、私はでrefernce.cs を作成したことは注目に値すると思いますsvcutilツールを使用しています。なぜなら、私はIsWrappedに問題があったからです。この質問を見て、答え: XmlSerializer attribute not valid in Web Service using WCF

+0

WCFトレースを試しましたか? https://msdn.microsoft.com/en-us/library/ms751526.aspx –

+0

送信したメッセージが正しいと思われ、返されたメッセージのようです。私は名前空間をちょっと調べて、一見して見えます。しかし、デシリアライゼーションは機能していないようで、おそらく何かがWSDLから間違って生成されるか、WSDLが間違っています。サービス参照を複数回追加(追加と削除)しようとしましたか、またはreference.csの何かを変更しましたか? – Cosmin

+0

ServiceStack.net - 本当に良いWebサービスライブラリを見てみることをお勧めします。彼らは、ダウンロードページの下部に古いオープンソースバージョンを持っています。 –

答えて

1

WSDLはelementFormDefault要素を定義していません:

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

修飾されていないがデフォルトなので、これはすべてのプロパティは、フォーム= System.Xml.Schemaが飾られるようにします。生成された参照ファイルでXmlSchemaForm.Unqualified。

しかし、それぞれの複雑なオブジェクトに指定したデフォルトの名前空間があるので、XMLシリアライザは、修飾されていないプロパティを処理しません。

ソリューション

変更スキーマ要素:

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

はまた、いくつかのプロパティのために、順序が間違っているので、彼らは(例えばTickerCreateResponse)に変更する必要があります:

<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> 

は、これらの変更後、svcutilを使用してプロキシを作成します。

svcutil.exe /シリアライザ:XmlSerializerをGenericTicketConnectorSOAP.wsdl /o:OtrsConnector.cs /ラップ/ N:*、OTRS

と設定を使用して:

<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> 

それはで、その後に動作するはずです少なくともそれは私のためにしました。

あなたのためにもうまくいきますように!

関連する問題