0

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>

resultListsearchは配列であることに注意してください。このメソッドを呼び出すと、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 を使用する際の問題であることを知っています。

4

3 に答える 3

0

SOAPItemRevisionHeadResult私が見る限り、 WSDLの型定義に何か問題があります。

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

この定義を持つ型は、次のものにマップされます。

Public class SOAPItemRevisionHeadResult{

    public string comment;
    public boolean searchComplete;
    public Stringmap[] search;  
    public SOAPItemRevisionHead[] resultList;
}

Public class StringMap{
//can't see definition of this type in your part of WSDL posted but doesn't matter.
//guesed definition by looking at the response
    public string StringKey;
    public string StrigValue;
//end of guesed definition
}

Public class SOAPItemRevisionHead{
  //can't see definition of this type in your part of WSDL posted but doesn't matter.
  //guesed definition by looking at the response
    public StringMap[] search;
  //end of guesed definition
}

入れ子のクラスが悪いようですWSDLが、Raw Response投稿したもので正しい入れ子を見ることができます:

Public class SOAPItemRevisionHeadResult{

    public string comment;
    public boolean searchComplete;
    public resultList as SOAPItemRevisionHead[]; 
}

Public class SOAPItemRevisionHead{

    public StringMap[] search;
}

Public class StringMap{

    public string StringKey;
    public string StrigValue;
}
于 2013-10-24T12:39:10.213 に答える
0

VS によって生成されたデータ コントラクトを確認します。CollectionDataContract属性で装飾された「resultList」の特定のタイプも含める必要があります。名前空間と名前が属性に正確に設定されているかどうかも確認しDataContractます。

編集: RPC スタイルの Web サービスについては、次のリンクで回避策を見つけることができます: http://social.msdn.microsoft.com/Forums/vstudio/en-US/51babae5-26e5-4405-b03c-4301710854c0/why-does- add-service-reference-fail-to-build-a-proper-reference-for-dfa?forum=wcf http://social.msdn.microsoft.com/Forums/vstudio/en-US/07edda1a-d0d5-4920 -b2fb-a25c803269d6/trouble-with-using-a-java-rpc-web-service-using-net-client?forum=wcf

于 2013-10-21T15:07:10.910 に答える