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

本文关键字:序列化 问题 消息 WCF xs anytype 带有 | 更新日期: 2023-09-27 18:07:15

我有一个客户提供的模式,它在wsdl中包含一个xs:anytype元素。

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

当我在visual studio (iis express)中运行我的服务时,这工作得很好,并且我正确地获得了属性中的XML。

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

无法强制转换System.Xml类型的对象。

为什么反序列化的行为不同于主机?我的类保存x的合适类型是什么:anytype?我怎样才能让它始终如一地运行?

注意:我已经接受了下面的第一个答案,因为它解决了当前的问题,但请参阅我添加的第二个答案,以获得最终的根本原因

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

XmlText表示XML中的字符串文字——元素的字符数据,而不是完整的元素。从错误中可以看出,XML可能包含完整的元素或字符数据。序列化程序试图将字符数据保存为XmlText,但由于无效强制转换错误而失败。要处理这个问题,请将属性类型从XmlElement切换到XmlNodeXmlNodeXmlTextXmlElement的基类,表示XML DOM层次结构中任何类型的节点。

另请参阅来自同一根本原因的不同症状的相关问题:WCF(反)序列化在调试/Visual Studio和IIS下的行为不同

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

xsd:anyType允许发送任意XML。在本例中,Java应用程序正在发送htmllencoded xml作为该元素的有效负载。WCF没有处理该内容并抛出序列化错误,而是接受它,并将其转化为XmlText而不是XmlElement。然而,水化后,没有完整的有效载荷,只有一个<</p>

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

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