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

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

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

例如,如果一个字段被称为“名称”,我们的代理将序列化为“nameField”。 我想这是因为名为“Name”的属性使用名为“nameField”的支持字段。 另一方面的服务显然无法解释这种命名约定。

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

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

我的问题是:为什么会发生这种情况? 为什么我们的代理使用DataContractSerializer,从而忽略了进程中的所有xml序列化属性? 有没有办法强迫他们再次使用XmlSerializer?

我们使用.NET 4.0。

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

要改为使用XmlSerializer ,请将[XmlSerializerFormat]添加到您的服务中 。 请参阅MSDN 。

您也可以尝试将[XmlType][XmlRoot]到您的类中(如果它尚未存在)。