尝试调用Web服务调用时,“未识别指定的类型”异常

时间:2010-06-08 12:40:54

标签: xml-serialization wsdl soap-client invalidoperationexception wse3.0

我正在尝试使用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”类型?

2 个答案:

答案 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消息。祝你好运!