2008-11-20 223 views
2

在與另一家公司合作中,我試圖編寫SOAP客戶端來與他們的服務進行交談。該服務本身沒有wsdl文件,但我已經成功地編寫了自己的繼承自SoapHttpClientProtocol的代理類。只返回一個整數或單個值的基本方法不是問題,但當我嘗試創建一個需要解析數組中返回的結果的方法時,我無法使其工作。問題的部分可能是,SOAP-結果引用不存在了一個命名空間,但設置反序列化C#中的SOAP數組

[SoapRpcMethodAttribute("Action", Use = SoapBindingUse.Literal)] 

的方法似乎忽視了這個命名空間的問題。但是,每當我嘗試將結果解析爲數組時,我都會返回空結果。

[SoapRpcMethodAttribute("Action", Use = SoapBindingUse.Literal)] 
[return: XmlArrayAttribute("Result")] 
public ComplexType[] getArray(int customerId, int subCustomerId, int subscriptionId, int type) 
{ 
    object[] result; 
    result = Invoke("getArray", new object[] { id }); 
    return ((ComplexType[])(result[0])); 
} 

我是否完全錯誤地認爲上述方法應該起作用?從服務器

XML結果看起來是這樣的(體內):

<getArray SOAP-ENC:root="1"> 
    <Result SOAP-ENC:arrayType="ns1:SOAPStruct[1]" xsi:type="SOAP-ENC:Array" xmlns:ns1="http://soapinterop.org/xsd"> 
     <item> 
      <id xsi:type="xsd:integer">60</id> 
      <name xsi:type="xsd:string">John</name> 
      <type xsi:type="xsd:string">1</type> 
     </item> 
     <item> 
      <id xsi:type="xsd:integer">99</id> 
      <name xsi:type="xsd:string">Jane</name> 
      <type xsi:type="xsd:string">1</type> 
     </item> 
    </Result> 
</getArray> 

而命名空間isssue是http://soapinterop.org/xsd不存在了,似乎但是這並不是主要問題。

回答

1

SOAP數組是一個rpc /編碼響應,您需要確保您設置客戶端類/方法的所有屬性,以便堆棧知道它處理rpc /編碼響應。 (使用= ...文字是絕對錯誤的)。

你的ComplexType的c#定義是什麼樣的?您可能需要在其上設置類型命名空間,例如[System.Xml.Serialization.SoapTypeAttribute(Namespace =「http://soapinterop.org/xsd」)]