如何直接使用WCF消息合同中的XML?

时间:2010-09-07 20:16:31

标签: xml wcf messagecontract

我正在与WCF合作,通过SOAP实现非常(非常)复杂的交互集(我们由一个从未听说过计算机的人控制的委员会交付)。我将收到一条如下信息:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
 <s:Header>
  ... (lots of "standard" stuff that noone has ever dared
       to cobble together in such non-standard ways before)
 </s:Header>
 <s:Body>
  <MyIncrediblyComplexXmlElement>
   ...
  </MyIncrediblyComplexXmlElement>
 </s:Body>
</s:Envelope>

...而且我不希望将正文内容解析为由xsd.exesvcutil.exe创建的对象模型(这些工具是否甚至可以生成可以成功序列化的对象模型/反序列化这个特定的XML是一个激烈争论的问题)。我计划创建一个Message Contract来实现这些服务,我想知道我是否可以做类似以下的事情:

[ServiceContract(Namespace = "mynamespace")]
public interface IMyServiceInterface
{
 [OperationContract(Action = "requestaction", ReplyAction = "replyaction")]
 MyResponseMessage MyMethod(MyRequestMessage request);
}

[MessageContract(IsWrapped = false)]
public class MyRequestMessage
{
 [MessageBodyMember(Namespace = "mynamespace", Order = 0)]
 public XmlElement MyIncrediblyComplexXmlElement { get; set; }
}

[MessageContract(IsWrapped = false)]
public class MyResponseMessage
{
 [MessageBodyMember(Namespace = "mynamespace", Order = 0)]
 public XmlElement SomeResponseXmlElement { get; set; }
}

...然后直接操作XML,并在请求和响应消息中输出。这将极大地简化开发,因为我只需处理可能在消息中显示的XML的一小部分,并且我可以比生成的对象模型允许的更简单地使用它们。

这种模式(在消息合同中使用XmlElement)是否适用于我的目的?如果没有,我如何实现直接使用XML的目标,而不必直接使用Message个对象?

2 个答案:

答案 0 :(得分:1)

可以使用XmlElement或XElement。它将把xsd:any放到WSDL中生成的消息描述中。如果您想避免对对象进行序列化和反序列化,那么就可以了,但在这种情况下,任何XML都可以到达。其他可能性是直接使用消息类型,但您已经拒绝它。

答案 1 :(得分:0)

您绝对可以编写Message检查器并将其插入WCF运行时,以便在将消息XML发送到服务器之前或在服务器端收到消息时对其进行操作。

查看MSDN docs on Message Inspectors或Pablo Pialorsi的blog post,了解更多提示。事情变得非常混乱和毛茸茸 - 但WCF运行时肯定会为您提供必要的钩子。这很好'不舒服?可能不是 - 但至少它是可能的,并且以文件的方式也是如此!