2009-09-23 78 views
2

調用Web服務方法時收到以下錯誤消息。在.NET中使用RPC /編碼SOAP Web服務時出錯

無法將類型System.Xml.XmlNode []的對象分配給System.String類型的對象。

Web服務是一項PHP服務。我使用這裏定義的wsdl文件中的wsdl.exe創建了我的代理類 - http://webservice.intelecast.com.au/traffic/PublicSoap/server.php?wsdl

下面是我打來的代理客戶端方法。

[System.Web.Services.Protocols.SoapRpcMethodAttribute("http://webservice.intelecast.com.au/traffic/PublicSoap/server.php#getAllTraffic", RequestNamespace="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php", ResponseNamespace="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php")] 
[return: System.Xml.Serialization.SoapElementAttribute("return")] 
public TmcInfo[] getAllTmcTraffic(string[] States, int[] EventCodes) { 
    object[] results = this.Invoke("getAllTmcTraffic", new object[] { //Error here 
       States, 
       EventCodes}); 

它出現在代理類是無法應對WSDL中定義的複雜類型/數組...我不確定現在該怎麼繼續無法在網絡上找到一個解決方案的任何地方。

下面是我收到的SOAP響應。這一切看起來都有效。

<?xml version="1.0" encoding="iso-8859-1"?> 
<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:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
     xmlns:tns="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php"> 
    <SOAP-ENV:Body> 
     <ns1:getAllTrafficResponse 
      xmlns:ns1="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php"> 
      <return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:TrafficInfo[2]"> 
       <item xsi:type="tns:TrafficInfo"> 
        <id xsi:type="xsd:string">1245632068110</id> 
        <entryDate xsi:type="xsd:datetime">22/06/2009 10:54:28</entryDate> 
        <direction xsi:type="xsd:int">0</direction> 
        <extent xsi:type="xsd:int">1</extent> 
        <locationCode xsi:type="xsd:int">31593</locationCode> 
        <countryCode xsi:type="xsd:int">4</countryCode> 
        <ltn xsi:type="xsd:int">56</ltn> 
        <diversionAdvice xsi:type="xsd:int">0</diversionAdvice> 
        <slAdvice xsi:type="xsd:int">0</slAdvice> 
        <quantifier xsi:type="xsd:int">0</quantifier> 
        <suppInfoCode xsi:type="xsd:int">0</suppInfoCode> 
        <addEvent xsi:type="xsd:int">0</addEvent> 
        <detDivAdvice xsi:type="xsd:int">0</detDivAdvice> 
        <destinations xsi:type="xsd:int">0</destinations> 
        <clSourceProblem xsi:type="xsd:int">0</clSourceProblem> 
        <eventCode xsi:type="xsd:int">802</eventCode> 
        <timeInfo xsi:type="tns:TimeInfo"> 
         <start xsi:type="xsd:string">21/06/2009 14:00:00</start> 
         <finish xsi:type="xsd:string">05/11/2009 14:00:00</finish> 
         <timeZone xsi:type="xsd:string">Australia/Brisbane</timeZone> 
        </timeInfo> 
        <location xsi:type="tns:Point"> 
         <lat xsi:type="xsd:float">-27.3112692120521</lat> 
         <lon xsi:type="xsd:float">153.029100894928</lon> 
        </location> 
        <additionalStreetInfo 
         xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:AdditionalStreetInfo[1]"> 
         <item xsi:type="tns:AdditionalStreetInfo"> 
          <street xsi:type="xsd:string">Bracken Ridge Rd</street> 
          <type xsi:type="xsd:string">CROSS</type> 
         </item> 
        </additionalStreetInfo> 
        <address xsi:type="tns:Address"> 
         <streetNumber xsi:type="xsd:string"/> 
         <streetName xsi:type="xsd:string">Bracken Ridge Rd</streetName> 
         <suburb xsi:type="xsd:string">Bracken Ridge</suburb> 
         <state xsi:type="xsd:string">QLD</state> 
        </address> 
       </item> 
       <item xsi:type="tns:TrafficInfo"> 
        <id xsi:type="xsd:string">1245632111995</id> 
        <entryDate xsi:type="xsd:datetime">22/06/2009 10:55:11</entryDate> 
        <direction xsi:type="xsd:int">1</direction> 
        <extent xsi:type="xsd:int">1</extent> 
        <locationCode xsi:type="xsd:int">31592</locationCode> 
        <countryCode xsi:type="xsd:int">4</countryCode> 
        <ltn xsi:type="xsd:int">56</ltn> 
        <diversionAdvice xsi:type="xsd:int">0</diversionAdvice> 
        <slAdvice xsi:type="xsd:int">0</slAdvice> 
        <quantifier xsi:type="xsd:int">0</quantifier> 
        <suppInfoCode xsi:type="xsd:int">0</suppInfoCode> 
        <addEvent xsi:type="xsd:int">0</addEvent> 
        <detDivAdvice xsi:type="xsd:int">0</detDivAdvice> 
        <destinations xsi:type="xsd:int">0</destinations> 
        <clSourceProblem xsi:type="xsd:int">0</clSourceProblem> 
        <eventCode xsi:type="xsd:int">802</eventCode> 
        <timeInfo xsi:type="tns:TimeInfo"> 
         <start xsi:type="xsd:string">21/06/2009 14:00:00</start> 
         <finish xsi:type="xsd:string">05/11/2009 14:00:00</finish> 
         <timeZone xsi:type="xsd:string">Australia/Brisbane</timeZone> 
        </timeInfo> 
        <location xsi:type="tns:Point"> 
         <lat xsi:type="xsd:float">-27.3125370752656</lat> 
         <lon xsi:type="xsd:float">153.042898178101</lon> 
        </location> 
        <additionalStreetInfo 
         xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:AdditionalStreetInfo[1]"> 
         <item xsi:type="tns:AdditionalStreetInfo"> 
          <street xsi:type="xsd:string">Bracken Ridge Rd</street> 
          <type xsi:type="xsd:string">CROSS</type> 
         </item> 
        </additionalStreetInfo> 
        <address xsi:type="tns:Address"> 
         <streetNumber xsi:type="xsd:string"/> 
         <streetName xsi:type="xsd:string">Bracken Ridge Rd</streetName> 
         <suburb xsi:type="xsd:string">Bracken Ridge</suburb> 
         <state xsi:type="xsd:string">QLD</state> 
        </address> 
       </item> 
      </return> 
     </ns1:getAllTrafficResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

回答

1

這是wsdl.exe中的錯誤嗎?我有幾個unpleasant encounters with wsdl.exe。下面是在我的崗位列出的問題:

失敗的第一個問題來處理 序列複雜的元素。你會覺得在今天的web服務 環境中,一系列複雜的元素是一個常態。但顯然 微軟並不這麼認爲,而這個 導致wsdl.exe到 無法處理一系列複雜的元素。

如果您堅持使用wsdl.exe 爲具有複雜類型序列的元素 生成代理類,該怎麼辦?你 會得到一個神祕的異常:無法 導入綁定*從命名空間* - 無法導入操作* - 數據類型*缺少第二個錯誤WSDL具有的是,它不是 允許有兩個Web方法 那具有相同的返回簽名。 是的,如果一個方法返回一個類型 ComplexType,其他方法必須 具有不同的返回類型。如果執行失敗 將導致 System.InvalidOperationException:來自名稱空間* 的XML元素*引用引用方法和 類型異常。

請注意,在這兩種情況下,消息 都是神祕的。你實際上不會知道 引擎蓋後面發生了什麼。而這是所有人中最令人沮喪的。 你不知道你是否因爲工具不好而失敗 ,或者因爲 你沒有做正確的事情。

也許你可以參考this post瞭解wsdl.exe的替代方法。

+0

我認爲這可能與第一個問題類似。它無法處理某些複雜的元素。它可能與SOAP信封中的xsi:type =「SOAP-ENC:Array」SOAP-ENC:arrayType類型數據更相關。我沒有使用WCF,其他文章並沒有真正幫助。 – 2009-09-23 03:30:07

+0

如果是這種情況,那麼我擔心你不能使用wsdl.exe,因爲MS不打算修復該錯誤 – Graviton 2009-09-23 04:04:30

+0

我試圖使用WCF實現這個代理使用者,並且我得到相同的錯誤消息。有趣... – 2009-09-23 07:50:03

0

值得注意的是,rpc/encoded SOAP實現在複雜類型上存在問題。解決此問題的一種方法是將WSDL轉換爲文檔/文字格式。