我有一个需要使用 wsdl 合同与之通信的 java 网络服务器。我没有构建服务器,也无权访问它的源代码。我构建了 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
andsearch
是数组。如果我调用此方法,这是原始响应,使用 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
自动生成的那个,并且我手动将两个应该是数组的属性的类型更改StringMap[]
为StringMap
不会抛出错误,但是当然我只能在我的数组中获取第一项程序。我希望我很清楚,即使这是一个很长的问题。
更新:我知道这是使用 Axis 1.4 的问题,它使用 rcp/encoded 而不是 document/literal,所以可以用这些术语重新表述问题:“.NET 可以正确处理 rcp/encoded 吗?”