2008-11-20 32 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”)]