在C#中反序列化SOAP数组

时间:2008-11-20 11:41:20

标签: c# soap serialization

在与另一家公司合作时,我正在尝试编写一个SOAP客户端来与他们的服务进行通信。服务本身没有wsdl文件,但我成功编写了自己继承自SoapHttpClientProtocol的代理类。仅返回整数或单个值的基本方法不是问题,但是当我尝试创建一个需要解析数组中返回的结果的方法时,我就无法使其工作。问题的一部分可能是SOAP结果引用了一个不再存在的命名空间,而是设置了

 [SoapRpcMethodAttribute("Action", Use = SoapBindingUse.Literal)]
该方法的

似乎忽略了命名空间问题。但是,每当我尝试将结果解析为数组时,我只会得到一个null结果。

[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 个答案:

答案 0 :(得分:1)

SOAP数组是一个rpc / encoded响应,您需要确保在客户端类/方法上设置所有属性,以便堆栈知道它处理rpc / encoded响应。 (Use = ... Literal肯定是错误的。)

您对ComplexType的c#定义是什么样的?您可能需要在其上设置类型命名空间,例如[System.Xml.Serialization.SoapTypeAttribute(命名空间= “http://soapinterop.org/xsd”)]