【问题标题】:Forcing ASMX proxy to use XmlSerializer instead of DataContractSerializer强制 ASMX 代理使用 XmlSerializer 而不是 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 对待它们的方式非常不同。
  • 作为网络参考。必须与配置有关,因为当我尝试在干净的解决方案中复制问题时 - 一切正常。没关系,我们现在正在使用解决方法。

标签: c# .net asmx datacontractserializer xmlserializer


【解决方案1】:

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

要改用XmlSerializer,请将[XmlSerializerFormat] 添加到您的服务。见MSDN

您也可以尝试将[XmlType][XmlRoot] 添加到您的课程中(如果还没有的话)。

【讨论】:

  • 正如我所说,我们正在使用外部服务,我对它们的实现方式没有发言权。由于某种原因,在序列化期间内部使用了错误的序列化程序。我会尽快研究 XmlType 和 XmlRoot 属性。谢谢。
  • @Vex 你如何引用外部服务? 准确地说
  • 我抓取 wsdl,然后在其上运行 wsdl.exe 并生成代理。无法引用 VS 中的服务,因为它们位于 VPN 中,而且公司中只有一个人可以访问它……他所能做的就是将 WSDL 保存到文件中并将其传递给我。一些关于安全的事情。
  • @Vex; k - 听起来应该可以工作;您只是使用常规 asmx 对吗?这是....有趣
  • 是的,常规 asmx。也许有人在配置中的某个地方放了一些东西,这样可能会造成问题,我不知道。我希望我有更多的时间来调查这件事,但我们远远落后于计划,如果我再花时间在这件事上,我可能会听到。他们只是希望我手动构建 xml 数据并使用 HttpWebRequest 发布它......糟透了。
猜你喜欢
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2017-01-23
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多