【问题标题】:Removing empty namespace from an ASMX WebService从 ASMX WebService 中删除空命名空间
【发布时间】:2011-11-15 16:17:59
【问题描述】:

我有一个带有 XmlNode 参数(我也尝试使用 XElement)和 XmlNode 返回类型的 Web 服务。

问题是,我传递了一个没有命名空间的参数:

<client>
    <name>Test</name>
</client>

然后服务器会收到这样的信息:

<client xmlns="">
    <name>Test</name>
</client>

返回对象也是如此。

通常不会有问题,但我使用自定义校验和来验证请求。类似于将 xml 参数的 MD5 传递给另一个参数。当服务器声明命名空间时,它会破坏 MD5。

现在我用替换来删除声明以使 md5 正常工作。 有人有更好的主意吗? (没有变通方法)

【问题讨论】:

  • 为什么不提供自己的命名空间?
  • @Carsten König:因为在我的应用程序中,命名空间是无用的(对于参数,网络服务有一个正确的命名空间),现在更改它会使客户端(这不是我的)“崩溃”
  • 您应该使用能够理解 XML 的加密机制。例如,SignedXml class.
  • @JohnSaunders 这可以工作,但我不知道客户端(不在 .net 中)是否可以提供相同的加密。
  • SignedXml 实现标准数字签名。

标签: c# xml web-services namespaces asmx


【解决方案1】:

我不确定您为什么要使用 MD5 验证 XML。一个更好的主意是使用 XSD 验证您的 XML。

存在许多关于如何在 C# 中针对 XSD 验证 XML 的问题

【讨论】:

  • 我同意。如果您使用的是 WCf,那么它会为您进行验证。为什么选择 MD5 进行这种类型的验证?
  • 我不使用 MD5 来验证 XML 完整性或参数。我所做的是确保客户端知道调用网络服务器的过程。如果客户端不知道要使用什么密钥或如何在消息上应用 MD5,则客户端不会自动使用 Web 服务器。这种方法更多的是验证客户端而不是消息本身。
【解决方案2】:

您在使用 WCF 服务吗?或者你可以迁移到他们那里吗?

您不能将此标签应用于您的 DataContracts 吗?

[DataContract(Namespace = "")]

这样数据就没有任何命名空间了。

这样的帖子可能吗?

Can I make XmlSerializer ignore the namespace on deserialization?

【讨论】:

  • 您确定不会生成完全相同的 XML 吗? xmlns="" 表示默认命名空间为空命名空间。
  • DataContract 选项仅适用于 WCF 服务。我会接受柯克布罗德赫斯特的回答。我会用 xsd 验证你的 xml。我知道在 Xelement 中,如果您愿意,您可以忽略任何名称空间。那是它是否是 xmls="" 无关紧要。