【问题标题】:WCF (de) serialization behaving differently under debug/Visual Studio and IISWCF(de)序列化在调试/Visual Studio 和 IIS 下表现不同
【发布时间】:2015-09-18 14:48:09
【问题描述】:

我有一个托管的 WCF 服务,其中一个方法具有 xs:AnyType 类型的元素。在我的代码中,我将 xs:Any 序列化为 XmlNode

在 Visual Studio (iis express) 中,我的消息完美通过,并将 XML 加载到 XmlNode 属性中。当我部署到 IIS 并发送完全相同的消息时,我得到一个

我之前遇到过一个相关的问题,在 Visual Studio 下,水合属性的真正类型是 XmlElement,但在 IIS 中,它以 XmlText 的形式出现(这就是我为什么选择 XmlNode,一个共同的祖先)看到那个上一期在这里WCF message with xs:anytype causing serialization problems

这两个问题似乎很可能是相关的,但为什么应用程序在 Visual Studio 下使用的序列化逻辑与在 IIS 中不同?

【问题讨论】:

    标签: c# asp.net wcf iis serialization


    【解决方案1】:

    烧录 MSDN 支持票后,我们找到了这两个问题的根本原因。这与 IIS 与 IIS express 无关,消息的内容略有不同。

    xsd:anyType 允许发送任意 XML。在这种情况下,Java 应用程序发送 HtmlEncoded xml 作为该元素的有效负载。 WCF 接受它并将其作为 XmlText 而不是 XmlElement 进行水合,而不是在此内容上呕吐并引发序列化错误。然而,水合后,完整的有效载荷并不存在,只有一个

    使这个问题令人困惑的是,所有调试窗口、WCF 跟踪等都“修复”了 htmlEncoded 内容以显示为有效的 XML。因此,当我从 WCF 跟踪中复制消息,并从 SoapUI 手动运行它以尝试重现时,行为发生了变化!

    我正在推动客户修复他们发送的消息中的有效负载,但如果这不可能,使用 IDispatchMessageInspector.AfterReceiveRequest 方法将能够转换有效负载并正确发送。

    【讨论】:

    • 嗨,Jason,如何从 SoapUI 为标记为 xs:anyType 的字段发送消息?谢谢
    • @JohnSmith 您可以在该字段内发送任意 XML。只要确保它格式正确,就好像你缺少结束标签或其他东西一样,它也会弄乱外部 XML。
    • 谢谢,杰森。我尝试将其作为<ezt:attribute>0</ezt:attribute> 发送,但wcf 服务器报告错误:来自命名空间的结束元素attribute ... 预期。找到文本0。如果我像<ezt:attribute/> 一样发送它,我得到'无法将'System.Object'类型的对象转换为类型......
    • 是attribute WSDL 中设置为anytype 的属性的名称吗?如果是这样,您需要执行 0。生成的类中的 anytype 字段的属性的数据类型是什么?目的? XmlNode?
    • 是的。 attribute 是 wsdl 中的属性有 xs:anyType。数据类型被定义为对象。那么我应该为 somexml 使用什么? xsd 文件中的行是 。 Reference.cs 中的行是 [System.Runtime.Serialization.DataMemberAttribute()] public object attributes {...}
    猜你喜欢
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2012-11-04
    • 1970-01-01
    • 2018-01-23
    • 2013-09-18
    • 1970-01-01
    相关资源
    最近更新 更多