如何在WCF中决定消息合同和数据合同?

时间:2011-03-18 15:13:13

标签: web-services wcf wcf-binding wse

我正在阅读很多东西来理解WCF中的各种事情。

实际上,我很快就想将现有的WSE3 Web服务移动/转换为WCF。在现有的WSE Web服务中,我有一些(数据)类可以在我们的环境中为实体建模。

在转换这些类时,我应该使用Data Contract / Data Member属性还是MessageContract属性?

1。如何在WCF中决定消息合同和数据合同? 2.绑定类型(如basicHttpBinding)在此决策中是否有任何作用? 3.在客户端创建的代理(当我们添加Web引用时)是否会根据数据或消息合同发生重大变化?

(PS:我正在尝试找到一种方法,以便现有的WSE客户端应该能够使用WCF服务而无需进行太多的更改/修改。是否可以使用从ASMX Web服务生成的当前代理连接到通过将代理的URL设置为WCF服务来实现新的WCF服务?)

2 个答案:

答案 0 :(得分:3)

快速回答您的问题:

1)除非有特殊原因需要调整soap XML的结构,否则请使用DataContract而不是MessageContract。

2& PS)由于您当前正在使用SOAP over HTTP,因此您很可能需要为basicHttpBinding配置新服务。这将提供ASMX客户端所需的互操作性。

3)如果WCF服务创建的soap结构与当前的soap匹配,则不应该这样。

我依稀记得WSE 3.0支持一些WS- *标准。如果您当前的代码依赖于这些代码,那么您也可以为这些操作公开wsHttpBinding,但我认为默认的ASMX客户端不能与wsHttpBinding配置的服务一起使用。

答案 1 :(得分:2)

这取决于您对生成的SOAP消息的控制。 DataContract定义由操作定义的元素包装的消息体的一部分。 MessageContract定义了整个消息的结构 - 您可以使用多个主体成员,您不必使用默认包装元素,也可以将一些数据放入SOAP标头中。

在您的场景中,最重要的部分是定义WCF以使用与以前的WSE3服务相同的SOAP消息。这里重要的是你目前如何序列化数据?如果使用Xml序列化(和属性),则可以通过switchinig从数据协定序列化到xml序列化直接在WCF中使用它。

顺便说一下。你为什么使用WSE3而不是普通的ASMX?你使用邮件安全吗?在这种情况下,您将需要另一个绑定。 BasicHttpBinding无法执行消息安全性。

一般答案是肯定的,您可以创建当前客户端代理将能够使用的服务。但实际上,努力取决于您当前的服务和当前代码。