1

我正在尝试使用 WSE 3.0 作为 Visual Studio 2005 中的客户端调用第三方 Web 服务。

调用工作正常,我可以看到我得到了很好的响应(我启用了跟踪),但显然 xml 解析器阻塞了它。我总是得到一个InvalidOperationException

XML 文档中存在错误。

有一个InnerException

无法识别指定的类型:name='Map',namespace=' http ://xml.apache.org/xml-soap',位于 <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/编码格式。如果您可以将服务器更改为文档/文字,那就更好了。

但由于这是第三方服务(已被其他客户使用),这对我们来说是没有选择的。

还有其他建议吗?如何让 xml 解析器识别“地图”类型?

4

2 回答 2

3

首先,下载 SOAPUI 并验证 wsdl、您的请求和响应。如果他们有任何问题,请告诉他们自己验证他们的网络服务并修复它(一群业余爱好者!)。如果 Web 服务不符合 WS-I 基本配置文件,我会说甚至不要浪费您的时间。


如果您仍然无法修复它,以下内容可能会为您指明正确的方向。

我在反序列化 xml 和 soap 响应时遇到了类似的异常,但是由于您没有提供很多细节,所以我真的不知道您的具体实现。所以这可能对你有用,或者根本没有:/。

我的问题是由继承类型的 xml 中的对象引起的。显然,如果没有一些额外的说明,XmlSerializer 就无法应对。

示例(C#):

我的 xml 包含类型的对象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继承对象的类型在哪里。

希望它可以帮助某人,祝你好运:)。

于 2012-04-25T17:33:02.530 回答
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 不一致。祝你好运!

于 2010-07-20T17:53:08.627 回答