1

私は WCF と関連テクノロジに非常に慣れていません。(ちなみに、WCF 4.0 を使用しています。)

以下は、インターフェースが必要な Web サービスの WSDL ファイルの一部です。

  <wsdl:binding name="MPGWCSTAOperations_v1_1SoapBinding" type="impl:MPGWCSTAOperations">
    <wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    ...
    <wsdl:operation name="MonitorStartLine">
      <wsdlsoap:operation soapAction="urn:v1_1.csta.ws.mpgw.gintel.com/MonitorStart" />
      <wsdl:input name="MonitorStartLineRequest">
        <wsdlsoap:body use="literal" />
      </wsdl:input>
      <wsdl:output name="MonitorStartLineResponse">
        <wsdlsoap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    ...
  </wsdl:binding>

  <wsdl:portType name="MPGWCSTAOperations">
  ...
    <wsdl:operation name="MonitorStartLine" parameterOrder="monitorStartLine">
      <wsdl:input name="MonitorStartLineRequest" message="impl:MonitorStartLineRequest" />
      <wsdl:output name="MonitorStartLineResponse" message="impl:MonitorStartLineResponse" />
    </wsdl:operation>
    ....
  </wsdl:portType>

  <wsdl:message name="MonitorStartLineResponse" />

私の理解では、MonitorStartLine 操作は応答メッセージ MonitorStartLineResponse を返すように定義されており、これは空のメッセージとして定義されています。

Visual Studio の Project - Add Service Reference 機能を使用して、このための C# プロキシ コードを生成しました。

それから私はこのようなことをします:

   MPGWCSTAOperationsClient cstaOperationsClient = new MPGWCSTAOperationsClient();

   MonitorStartLine monitorStartLine = new MonitorStartLine();
   monitorStartLine.pnis = new string[] {"0000032"};

   cstaOperationsClient.MonitorStartLine(monitorStartLine);

これにより、次の例外が発生します。

System.ServiceModel.CommunicationException was unhandled
  HResult=-2146233087
  Message=Error in deserializing body of reply message for operation 'MonitorStartLine'. 
  End element 'Body' from namespace 'http://schemas.xmlsoap.org/soap/envelope/' expected. 
  Found element 'monitorStartLineResponse' from namespace 'urn:v1_1.csta.ws.mpgw.gintel.com'. Line 1, position 296.
  Source=mscorlib

Fiddler を使用すると、次のような応答が表示されます。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Content-Type: text/xml;charset=utf-8
Transfer-Encoding: chunked
Date: Wed, 16 Oct 2013 22:01:44 GMT

149
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <monitorStartLineResponse xmlns="urn:v1_1.csta.ws.mpgw.gintel.com"/>
  </soapenv:Body>
</soapenv:Envelope>

WSDLに準拠しているように見えます。

おそらくエラーを無視できると思いますが(サーバーが賢明になることはありません)、可能であれば問題を修正したいと思います。

4

2 に答える 2

3

メッセージは WSDL に準拠していますが、WSDL 仕様があいまいな場所にあります。Bodyメッセージ部分が定義されていないため、.NET は要素内に何も期待していません。送信者はmonitorStartLineResponse、単一のメッセージ部分が指定されたかのように、代わりに空の要素を送信していますmonitorStartLineResponse

WSDL 仕様があいまいな領域があるため、Web Services Interoperability Organizationが形成されました。WS-I Basic Profile 1.1仕様は、プラットフォーム間での相互運用性が保証されている WSDL のサブセットを指定するために開発されました。

この WSDL は WS-I BP 1.1 に準拠していません。


実際、WSDL 1.1 仕様(セクション 3.4、soap:operation ) を読むと、「スタイル」属性がないため、これは「ドキュメント リテラル バインディング」と見なされることがわかります。

セクション4.4.1、バインディングとパーツ、R2213 で、WS-I BP 1.1 仕様は次のように述べています。

R2213の parts 属性の値が空の文字列である doc-literal 記述ではsoapbind:body、対応する ENVELOPE の要素に要素コンテンツが含まれていてはなりませんsoap:Body

これは .NET が期待しているものですが、.NET が受け取っているものではありません。

于 2013-10-17T01:52:39.190 に答える