强制ASMX代理使用XmlSerializer而不是DataContractSerializer

本文关键字:DataContractSerializer XmlSerializer ASMX 代理 强制 | 更新日期: 2023-09-27 18:15:46

我们获得了必须在项目中使用的外部SOAP服务。所有这些都提供WSDL数据,但其中许多不是. net服务(其中大多数是用Java编写的)。我们已经用wsdl.exe工具生成了许多客户端代理。这个工具做它应该做的,它创建代理供我们使用。

当我们尝试使用生成的代理调用这些服务上的方法时,问题就出现了。为了记录日志,我们拦截了所有SOAP请求,XML数据看起来与WSDL模式中指定的数据不同。

例如,如果一个字段被称为"Name",我们的代理将把它序列化为"nameField"。我猜这是因为名为"Name"的属性使用了一个名为"nameField"的后备字段。另一端的服务显然无法解释这种命名约定。

如果我们的ASMX代理使用旧的XmlSerializer,则不会发生这种情况,但由于某种原因,它们选择了DataContractSerializer,这会完全打乱序列化并破坏客户端和服务之间的兼容性。

我的同事已经诉诸于手动构造XML数据,然后发送它与HttpWebRequest类。我认为这在2011年是完全不可接受的,这就是自动代理生成的目的。

我的问题是:为什么会这样?为什么我们的代理使用DataContractSerializer,从而忽略了过程中的所有xml序列化属性?是否有办法迫使他们再次使用XmlSerializer ?

我们使用。net 4.0

强制ASMX代理使用XmlSerializer而不是DataContractSerializer

如果您使用的是WCF,则默认为DataContractSerializer。如果类型没有显式的[DataContract]/[DataMember]标记,那么DataContractSerializer将使用字段,这听起来像正在发生的事情。

要使用XmlSerializer,请将[XmlSerializerFormat]添加到服务。看到MSDN。

您也可以尝试添加[XmlType][XmlRoot]到您的类(如果它还没有)。

相关文章:
  • 没有找到相关文章