我正在编写一个接收事件的WCF服务。这是一个商定的标准,所以我必须坚持服务定义,我不控制客户端发送的数据。虽然数据可能会有所不同,但这是一个商定的标准。
以下是我服务的方法之一:
complexType ErrorEvent(int requestId, complexType returnValue, ref string errorInfo)
客户端在我的函数将操作并返回的errorInfo字符串中发送XML。
我得到的数据就像这样(完整的SOAP请求):
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ErrorEvent xmlns="http://blah">
<requestId>1</requestId>
<returnValue>
<returnCode>0</returnCode>
</returnValue>
<errorInfo>
<ErrorMessage>An error message</ErrorMessage>
<DefaultTask><!-- Complex data --></DefaultTask>
<Task><!-- Complex data --></Task>
<Task><!-- Complex data --></Task>
<Task><!-- Complex data --></Task>
<ExtraMessage>hello</ExtraMessage>
<ExtraMessage>world</ExtraMessage>
</errorInfo>
</ErrorEvent>
</s:Body>
</s:Envelope>
然而,当我尝试运行它时,我收到此错误(已编辑):
格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数errorInfo时出错。 InnerException消息是'反序列化System.String类型的对象时出错。结束元素'errorInfo'来自命名空间''预期。从命名空间''找到元素'ErrorMessage'。
所以我的问题是,有没有办法在不改变方法签名的情况下实现我想做的事情?例如,向我的服务添加属性等?或者我是否需要拦截消息?
感谢您的任何指示。
答案 0 :(得分:0)
是否必须以字符串形式传递?你知道你也可以在WCF中收到XmlElement和XElements吗?
您是否自己生成SOAP请求?你能使用CDATA部分,即
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ErrorEvent xmlns="http://blah">
<requestId>1</requestId>
<returnValue>
<returnCode>0</returnCode>
</returnValue>
<errorInfo>
<![CDATA[<ErrorMessage>An error message</ErrorMessage>
<DefaultTask><!-- Complex data --></DefaultTask>
<Task><!-- Complex data --></Task>
<Task><!-- Complex data --></Task>
<Task><!-- Complex data --></Task>
<ExtraMessage>hello</ExtraMessage>
<ExtraMessage>world</ExtraMessage>]]>
</errorInfo>
</ErrorEvent>
</s:Body>
</s:Envelope>
答案 1 :(得分:0)
我没有找到一种方法来完成这项工作,正如@luksan所说,客户端误将未转义的XML发送到字符串参数。
我采用的解决方法是创建一个实现IClientMessageInspector,IDispatchMessageInspector和IEndpointBehavior的类来拦截,检查和修改任何不正确的消息。
如果我可以更改界面,另一种解决方法是接受XmlNode []而不是字符串。