wsdl コントラクトを使用して通信する必要がある Java Web サーバーがあります。私はサーバーを構築していません。また、そのソース コードにアクセスすることもできません。私は ac# アプリケーションを構築し、Visual Studio の「サービス参照の追加」を使用して wsdl コントラクトにサービス参照を追加しました。関心のある wsdl の部分を貼り付けます。
<wsdl:operation name="SOAPRequestItemHead" parameterOrder="SessionID searchitems">
<wsdl:input message="impl:SOAPRequestItemHeadRequest" name="SOAPRequestItemHeadRequest"/>
<wsdl:output message="impl:SOAPRequestItemHeadResponse" name="SOAPRequestItemHeadResponse"/>
</wsdl:operation>
<wsdl:operation name="SOAPRequestItemHead">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="SOAPRequestItemHeadRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://wrapper.soap.aplusb.com" use="encoded"/>
</wsdl:input>
<wsdl:output name="SOAPRequestItemHeadResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://192.168.200.26:8888/tcdnc/services/fsw" use="encoded"/>
</wsdl:output>
</wsdl:operation>
<wsdl:message name="SOAPRequestItemHeadResponse">
<wsdl:part name="SOAPRequestItemHeadReturn" type="tns2:SOAPItemRevisionHeadResult"/>
</wsdl:message>
<complexType name="SOAPItemRevisionHeadResult">
<sequence>
<element maxOccurs="1" minOccurs="0" name="comment" nillable="true" type="xsd:string"/>
<element name="searchComplete" type="xsd:boolean"/>
<element maxOccurs="unbounded" minOccurs="0" name="search" type="tns2:StringMap"/>
<element maxOccurs="unbounded" minOccurs="0" name="resultList" type="tns2:SOAPItemRevisionHead"/>
</sequence>
</complexType>
resultList
とsearch
は配列であることに注意してください。このメソッドを呼び出すと、SOAP ツールで取得した生の応答が次のようになります。
<SOAPRequestItemHeadReturn xmlns:ns2="fsw" xsi:type="ns2:SOAPItemRevisionHeadResult">
<comment xsi:type="xsd:string" xsi:nil="true"/>
<searchComplete xsi:type="xsd:boolean">true</searchComplete>
<resultList xsi:type="ns2:SOAPItemRevisionHead">
<search xsi:type="ns2:StringMap">
<stringKey xsi:type="xsd:string">ItemRevision.ItemID</stringKey>
<stringValue xsi:type="xsd:string">cam_english_template</stringValue>
</search>
<search xsi:type="ns2:StringMap">
<stringKey xsi:type="xsd:string">ItemRevision.Revision</stringKey>
<stringValue xsi:type="xsd:string">A</stringValue>
</search>
<dummy xsi:type="xsd:string" xsi:nil="true"/>
</resultList>
<resultList xsi:type="ns2:SOAPItemRevisionHead">
...
ご覧のとおり、resultList
実際search
には配列です。しかし、C# クライアントからメソッドを呼び出すと、次のエラーが発生します。
操作 'SOAPRequestItemHead' の応答メッセージの本文をデシリアライズ中にエラーが発生しました。
内部例外: XML ドキュメントにエラーがあります (1, 815)。
内部例外: StringMap 型のオブジェクトを StringMap[] 型のオブジェクトに割り当てることはできません
そして、Reference.cs
自動的に生成された に移動し、配列であるはずの 2 つのプロパティの型を手動で変更するとStringMap[]
、StringMap
エラーはスローされませんが、もちろん、配列の最初の項目しか取得できません。プログラム。たとえそれが長い質問であっても、私が明確だったことを願っています。
更新: これは、document/literal の代わりに rcp/encoded を使用する Axis 1.4 を使用する際の問題であることを知っています。