【发布时间】:2012-01-05 00:14:15
【问题描述】:
我们获得了必须在项目中使用的外部 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 作为服务参考还是 Web 参考?因为 .net 对待它们的方式非常不同。
-
作为网络参考。必须与配置有关,因为当我尝试在干净的解决方案中复制问题时 - 一切正常。没关系,我们现在正在使用解决方法。
标签: c# .net asmx datacontractserializer xmlserializer