我正在尝试使用WSE 3.0作为Visual Studio 2005中的客户端调用第三方Web服务。
调用工作正常,我可以看到我得到了一个很好的响应(我启用了跟踪),但显然xml解析器会扼杀它。我总是得到InvalidOperationException
:
XML文档中存在错误。
使用InnerException
:
无法识别指定的类型:name ='Map',namespace ='http://xml.apache.org/xml-soap',at< bevoegdheid xmlns =''>。
这是回复的相关部分:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="https://acceptatie.cartalk.nl/Soap/Apk" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<SOAP-ENV:opvragenKeurmeesterGegevensResponse>
<opvragenKeurmeesterGegevensReturn xsi:type="ns2:Backend_Apk_Result_OpvragenKeurmeesterGegevens">
<naam xsi:type="xsd:string">A name</naam>
...
<bevoegdheid SOAP-ENC:arrayType="ns1:Map[2]" xsi:type="SOAP-ENC:Array">
<item xsi:type="ns1:Map">
<item>
<key xsi:type="xsd:string">soortBevoegdheid</key>
<value xsi:type="xsd:string">AL</value>
</item>
...
</item>
<item>
...
</item>
</bevoegdheid>
<meldingSoort xsi:nil="true" />
<meldingNummer xsi:nil="true" />
<melding xsi:nil="true" />
</opvragenKeurmeesterGegevensReturn>
</SOAP-ENV:opvragenKeurmeesterGegevensResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
这就是在wsdl中定义“bevoegdheid”的方式:
<xsd:element name="bevoegdheid" type="soap-enc:Array" />
在wsdl中没有提到“地图”类型。
我一直在谷歌搜索,但我发现的唯一答案是
该服务使用rpc / encoded格式,这种格式难以与之互操作。如果你可以将服务器更改为document / literal,那就更好了。
但是因为这是第三方服务(已经被其他客户使用),所以我们别无选择。
还有其他建议吗?如何让xml解析器识别出“Map”类型?
答案 0 :(得分:3)
首先,下载SOAPUI并验证wsdl,您的请求和响应。如果他们身边有任何问题,请告诉他们自己验证他们的网络服务并修复它(一群业余爱好者!)。如果Web服务不符合WS-I Basic Profile,我会说甚至不浪费你的时间。
如果您仍然无法解决问题,则以下可能会指出正确的方向。
我在反序列化xml和soap响应时遇到了类似的异常,但由于你没有提供很多细节,我真的不知道你的具体实现。所以这可能对你有用,或者根本不对:/。
我的问题是由xml中的继承类型的对象引起的。显然,没有一些额外的指示,XmlSerializer无法应对。
示例(C#):
我的xml包含Function
类型的对象和一些从Function继承的类型。
因此,创建XMLSerializer的常规语法不起作用。
XmlSerializer Serializer = new XmlSerializer(typeof(MyCustomObject);
显然序列化程序需要一些额外的指令,如下所示:
XmlSerializer Serializer = new XmlSerializer(typeof(MyCustomObject), new Type[] {typeof(Function.InheritedType1), typeof(Function.InheritedType2), typeof(Function.InheritedType3), typeof(Function.InheritedType4) });
其中InheritedType
是继承对象的类型。
希望它可以帮助别人,祝你好运:)。
答案 1 :(得分:0)
这里可能存在一些问题。一个可能如下:
<bevoegdheid SOAP-ENC:arrayType="ns1:Map[2]" xsi:type="SOAP-ENC:Array">
在肥皂信息中。解析器可能不喜欢“bevoegdheid”元素的WSDL类型属性定义与soap消息中元素的xsi:type值之间存在大小写不匹配的事实。此问题可能会导致您看到的实际(有点误导性)异常。我不确定如何修复这样的东西,因为你不控制任何一个组件。
异常消息是说“ns1:Map [2]”的arrayType值不是ns1名称空间的有效元素名称。该命名空间应该在XSD中为“http://xml.apache.org/xml-soap”定义,但似乎不是。遗憾的是,根本问题可能是服务正在生成似乎与服务的WSDL不一致的soap消息。祝你好运!