我们获得了必须在项目中使用的外部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。
答案 0 :(得分:2)
如果您使用的是WCF,则默认值为DataContractSerializer
。如果类型没有明确的[DataContract]
/ [DataMember]
标记,则DataContractSerializer
将使用字段,这听起来就像正在发生的事情。
要改为使用XmlSerializer
,请将[XmlSerializerFormat]
添加到服务。请参阅MSDN。
您还可以尝试将[XmlType]
或[XmlRoot]
添加到您的课程中(如果尚未添加)。