带有xs::type的WCF消息导致序列化问题

时间:2015-08-10 17:41:10

标签: c# xml wcf serialization soap

我有一个客户提供的架构,其中包含wsdl中的xs:anytype元素。

原始生成的代码包含object类型的属性。基于SO的其他一些答案,我将其改为XmlElement类型。

当我在visual studio(iis express)中运行我的服务时,这工作正常,我在属性中正确获取XML。

在IIS中部署时向我的应用发送完全相同的SOAP消息会产生错误

无法将“System.Xml.XmlText”类型的对象强制转换为“System.Xml.XmlElement”。

为什么反序列化的行为会因托管而异?我的类保存xs的正确类型是什么:anytype?我怎样才能让这种行为始终如一?

注意:我接受了下面的第一个答案,因为它解决了眼前的问题,但是看到我为最终根本原因添加的第二个答案

2 个答案:

答案 0 :(得分:1)

XmlText表示XML中的字符串文字 - 元素的character data而不是完整元素。从错误中可以看出,您的XML可能包含完整元素或可能包含字符数据。序列化程序正在尝试将字符数据保存为XmlText,但失败时出现无效的强制转换错误。要处理此问题,请将您的媒体资源类型从XmlElement切换为XmlNodeXmlNodeXmlTextXmlElement的基类,表示XML DOM层次结构中的任何类型的节点。

答案 1 :(得分:1)

另请参阅相同根本原因的不同症状的相关问题:WCF (de) serialization behaving differently under debug/Visual Studio and IIS

在刻录MSDN支持服务单后,我们找到了这两个问题的根本原因。它不是IIS与IIS表达相关的,消息的内容略有不同。

xsd:anyType允许发送任意XML。在这种情况下,Java应用程序正在发送HtmlEncoded xml作为该元素的有效负载。而不是嘲笑这个内容并抛出序列化错误,WCF接受它,并将其水合为XmlText而不是XmlElement。然而,在水合之后,没有完整的有效载荷,只有<

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

我正在推回客户来修复他们发送的消息中的有效负载,但如果无法做到这一点,使用IDispatchMessageInspector.AfterReceiveRequest方法将能够转换有效负载并正确发送它。