我有一个客户提供的架构,其中包含wsdl中的xs:anytype元素。
原始生成的代码包含object类型的属性。基于SO的其他一些答案,我将其改为XmlElement类型。
当我在visual studio(iis express)中运行我的服务时,这工作正常,我在属性中正确获取XML。
在IIS中部署时向我的应用发送完全相同的SOAP消息会产生错误
无法将“System.Xml.XmlText”类型的对象强制转换为“System.Xml.XmlElement”。
为什么反序列化的行为会因托管而异?我的类保存xs的正确类型是什么:anytype?我怎样才能让这种行为始终如一?
注意:我接受了下面的第一个答案,因为它解决了眼前的问题,但是看到我为最终根本原因添加的第二个答案
答案 0 :(得分:1)
XmlText
表示XML中的字符串文字 - 元素的character data而不是完整元素。从错误中可以看出,您的XML可能包含完整元素或可能包含字符数据。序列化程序正在尝试将字符数据保存为XmlText
,但失败时出现无效的强制转换错误。要处理此问题,请将您的媒体资源类型从XmlElement
切换为XmlNode
。 XmlNode
是XmlText
和XmlElement
的基类,表示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方法将能够转换有效负载并正确发送它。