1

我想打電話給使用WSE 3.0作爲客戶端的第三方Web服務在Visual Studio 2005「指定的類型無法識別」嘗試調用Web服務調用

呼叫工作正常,我當異常可以看到我得到了很好的響應(我啓用了跟蹤),但顯然xml解析器扼殺了它。我總是得到一個InvalidOperationException

XML文檔中有en錯誤。

InnerException

指定的類型不能被識別:名稱= '地圖',命名空間= '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> 

這是怎麼說, 「bevoegdheid」 在WSDL定義:

<xsd:element name="bevoegdheid" type="soap-enc:Array" /> 

有一個沒有提到「地圖「類型的任何地方在wsdl。

我一直在谷歌上搜索周圍這一點,但唯一的一種答案,我發現是沿

東西線服務使用RPC /編碼格式,它是很難獲得互操作性。如果您可以將服務器更改爲文檔/文字,則效果會更好。

但是,由於這是第三方服務(已被其他客戶使用),這對我們來說不是選擇。

其他建議?如何讓XML解析器識別「Map」類型?

回答

0

這裏可能有幾個問題。一個可能如下:

<bevoegdheid SOAP-ENC:arrayType="ns1:Map[2]" xsi:type="SOAP-ENC:Array"> 

在soap消息中。解析器可能不喜歡「bevoegdheid」元素的WSDL類型屬性定義與soap消息中元素的xsi:type值之間存在案例不匹配的情況。這個問題可能會導致您看到的實際(有點令人誤解)的異常。我不知道如何解決這樣的問題,因爲你不控制任何一個組件。

異常消息是說,「ns1:Map [2]」的arrayType值不是ns1命名空間的有效元素名稱。該名稱空間應該在XSD中定義爲「http://xml.apache.org/xml-soap」,但它看起來不是。不幸的是,最根本的問題可能是服務生成的SOAP消息與服務的WSDL看起來不一致。祝你好運!

2

首先,下載SOAPUI並驗證wsdl,你的請求和響應。如果他們有任何問題,請告訴他們自己驗證他們的webservice並修復它(一羣業餘愛好者!)。如果Web服務不符合WS-I Basic Profile,我會說甚至不會浪費你的時間。


如果您仍然無法修復它,下面可能點你在正確的方向。

我已經得到了類似的異常,而反序列化xml和肥皂響應,但由於你沒有提供很多細節,我真的不知道你的具體實現。所以這可能對你有用,或根本沒有用:/。

我的問題是由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是繼承對象的類型。

希望它可以幫助某人,祝你好運:)。