接受XML的WCF服务引用字符串参数?

时间:2012-08-30 11:42:16

标签: wcf xml-serialization datacontractserializer

我正在编写一个接收事件的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'。

所以我的问题是,有没有办法在不改变方法签名的情况下实现我想做的事情?例如,向我的服务添加属性等?或者我是否需要拦截消息?

感谢您的任何指示。

2 个答案:

答案 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 []而不是字符串。