gpt4 book ai didi

c# - 在 C# 中反序列化 SOAP 数组

转载 作者:太空宇宙 更新时间:2023-11-03 14:37:38 24 4
gpt4 key购买 nike

在与另一家公司合作时,我试图编写一个 SOAP 客户端来与他们的服务对话。该服务本身没有 wsdl 文件,但我已经成功地编写了我自己的继承自 SoapHttpClientProtocol 的代理类。只返回整数或单个值的基本方法不是问题,但是当我尝试创建一个需要解析数组中返回的结果的方法时,我无法让它工作。部分问题可能是 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>

命名空间问题是 http://soapinterop.org/xsd似乎不再存在了,但这不是主要问题。

最佳答案

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

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

关于c# - 在 C# 中反序列化 SOAP 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/305029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com