gpt4 book ai didi

c# - ASMX Web 服务的反序列化部分失败

转载 作者:行者123 更新时间:2023-11-30 12:29:15 25 4
gpt4 key购买 nike

  • 请注意,我正在修改现有服务以添加额外的数据成员,我无法更改服务或客户端的结构。我知道 ASMX 已经过时并且没有使用最佳实践。

我遇到了一个非常奇怪的问题,我就是不知道如何让它正常工作。我有一个 ASMX Web 服务(我知道它已经过时了,我无法更改它)需要响应并使用 zip 压缩对其进行压缩。然后它通过 SOAP 传递给客户端,客户端获取流并对其进行解压缩,并使用“添加服务引用”创建的契约(Contract)和 XMLSerializer 来反序列化对象。

我遇到的问题是它无法正确反序列化对象。压缩前和解压后的 XML 看起来完全一样,但 Web 服务似乎忽略了参数的顺序。我试过 [DataMember] 、 [MessageBodyMember]、[XmlElement]、[MessageHeader] 都使用正确的排序参数和 MustUnderstand,但它似乎总是将元素放在 XML 的底部。

这是令人困惑的地方,我的消息合约类继承自另一个消息合约类,就像这样

[MessageContract(IsWrapped = true)]
public class MyClass : MyBaseContract{}

基础联系人中的元素每次反序列化都很好,即使我改变它们也能正常工作。那里的元素根本不包含任何顺序,它们只是工作。

这是我的反序列化代码。

using (MemoryStream stream = new MemoryStream(data))
{
XDocument document = XDocument.Load(stream);

System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(type);
System.Xml.XmlReader read = System.Xml.XmlReader.Create(new System.IO.StringReader(document.ToString()));

object o = serializer.Deserialize(read);

return o;
}

这是序列化代码:

        XmlSerializer xs = new XmlSerializer(value.GetType());
MemoryStream stream = new MemoryStream();
xs.Serialize(stream, value);
stream.Position = 0;
StreamReader sr = new StreamReader(stream);
return sr.ReadToEnd();

所以这是我的代码执行的步骤

  1. 调用网络服务
  2. Web 服务调用 helper 并返回响应对象
  3. 响应对象被压缩
  4. 压缩对象以 soap 格式通过网络发送
  5. 客户得到响应
  6. 客户端根据“添加服务引用”功能提供的契约(Contract)进行反序列化。
  7. 客户端设法反序列化来自响应基类的数据,但响应类本身没有任何数据被反序列化。

最佳答案

好的,我解决了它,但它真的很奇怪。

发生的事情是“添加服务引用”生成的代码包含一个命名空间 aka

    [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://myservice.com")]

但是您可以手动执行的 XML 序列化不会在生成的 XML 中的任何位置包含命名空间。如果我指定使用此代码,XML 序列化程序将中断。

   [MessageContract(IsWrapped = true,WrapperNamespace="http://myservice.com")]

让它正常工作的唯一方法是将指定命名空间的行从生成的代码添加回合约类,就像这样。

[XmlType(Namespace="http://myservice.com")]
public class MyContract {}

添加之后,所有生成的 xml 将在每个元素中包含完整的命名空间,反序列化器将正常运行。我不知道为什么它打破了命名空间的 WCF 主义。它适用于其他 WCF isms。

首先它部分工作的原因是之前的开发人员添加了一个方法,该方法在客户端的某些 XML 元素上手动插入 namespace 。特别是那些工作正常的基类!我只是没有看到被调用的方法,因为它被埋得太深了。

关于c# - ASMX Web 服务的反序列化部分失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18994116/

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