1

我正在与 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.exeor创建的对象模型svcutil.exe(这些工具是否甚至可以生成可以成功序列化/反序列化此特定 XML 的对象模型是一个激烈争论的问题)。我计划创建一个消息契约来实现这些服务,我想知道我是否可以做类似于以下的事情:

[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直接使用对象的目标?

4

2 回答 2

1

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

于 2010-09-07T21:07:47.260 回答
0

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

查看Message Inspectors 上的 MSDN 文档,或 Pablo Pialorsi 的博客文章,了解更多提示。有时事情会变得非常混乱和麻烦 - 但 WCF 运行时确实为您提供了必要的钩子。它nice'n'easy?可能不会——但至少它是可能的,而且也是有记录的!

于 2010-09-07T21:03:29.137 回答