强制 ASMX 代理使用 XmlSerializer 而不是 DataContractSerializer
Posted
技术标签:
【中文标题】强制 ASMX 代理使用 XmlSerializer 而不是 DataContractSerializer【英文标题】:Forcing ASMX proxy to use XmlSerializer instead of DataContractSerializer 【发布时间】: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 对待它们的方式非常不同。 作为网络参考。必须与配置有关,因为当我尝试在干净的解决方案中复制问题时 - 一切正常。没关系,我们现在正在使用解决方法。 【参考方案1】:如果您使用 WCF,则默认值为 DataContractSerializer
。如果这些类型没有明确的[DataContract]
/[DataMember]
标记,那么DataContractSerializer
将使用字段,这听起来像是正在发生的事情。
要改用XmlSerializer
,请将[XmlSerializerFormat]
添加到您的服务。见MSDN。
您也可以尝试将[XmlType]
或[XmlRoot]
添加到您的课程中(如果还没有的话)。
【讨论】:
正如我所说,我们正在使用外部服务,我对它们的实现方式没有发言权。由于某种原因,在序列化期间内部使用了错误的序列化程序。我会尽快研究 XmlType 和 XmlRoot 属性。谢谢。 @Vex 你如何引用外部服务? 准确地说? 我抓取 wsdl,然后在其上运行 wsdl.exe 并生成代理。无法引用 VS 中的服务,因为它们位于 *** 中,而且公司中只有一个人可以访问它……他所能做的就是将 WSDL 保存到文件中并将其传递给我。一些关于安全的事情。 @Vex; k - 听起来应该可以工作;您只是使用常规 asmx 对吗?这是....有趣 是的,常规 asmx。也许有人在配置中的某个地方放了一些东西,这样可能会造成问题,我不知道。我希望我有更多的时间来调查这件事,但我们远远落后于计划,如果我再花时间在这件事上,我可能会听到。他们只是希望我手动构建 xml 数据并使用 HttpWebRequest 发布它......糟透了。以上是关于强制 ASMX 代理使用 XmlSerializer 而不是 DataContractSerializer的主要内容,如果未能解决你的问题,请参考以下文章