【问题标题】:How to decide between Message Contract and Data Contract in WCF?如何在 WCF 中选择消息契约和数据契约?
【发布时间】:2011-03-18 15:13:13
【问题描述】:

我正在阅读很多东西以了解 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 服务?)

【问题讨论】:

    标签: web-services wcf wcf-binding wse


    【解决方案1】:

    以下是回答您问题的快速方法:

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

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

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

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

    【讨论】:

    • @Sixto Saez:谢谢。如何确保 WCF SOAP 消息与现有的 WSE3 服务 SOAP 完全相同?您对第三个问题的回答是否意味着“数据合约不会影响客户端生成的代理”和“数据合约在创建 SOAP 消息中没有作用”?
    • 1:检查soap消息的最基本方法是在发送到服务时捕获它们。我使用 Fiddler2 作为 HTTP“嗅探器”。它捕获源自您机器的所有 HTTP 请求和响应。如果您在您的机器上运行该服务,请确保使用机器名称,而不是 localhost,以便 Fiddler 将捕获它。使用 Fiddler,让 WSE 客户端调用 WSE 服务来捕获肥皂。接下来,让 WCF 客户端调用 WCF 服务并获取肥皂。比较结果。肥皂标题部分的差异通常是良性的。皂体结构和元素名称需要完全匹配。
    • 2:实际上 DataContract 定义了操作参数的结构,因此它确实会影响整个服务合同。为现有 WSE 服务生成 WCF 类的最简单方法是获取该服务的当前 WSDL 文件。接下来,使用“地址”的文件路径和文件名在 Visual Studio 项目中添加服务引用。 Visual Studio 然后将创建必要的类以符合 WSDL。 Michelle Bustamante 的《Learning WCF》一书是开始学习 WCF 的好地方
    • 另外,很遗憾,一篇文章确实不会包含您正在寻找的知识。 WCF 非常复杂,所以我发现 Learning WCF 这本书是一本非常有用的指南,这就是我推荐它的原因。
    【解决方案2】:

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

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

    顺便说一句。为什么你使用 WSE3 而不是普通的 ASMX?您是否使用了消息安全性?在这种情况下,您将需要另一个绑定。 BasicHttpBinding 不能做消息安全。

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

    【讨论】:

    • 谢谢。你的回答很有帮助。但我想知道你的第二句话“....由操作定义的元素包裹”的含义。这是什么意思?此外,如果一个类具有 DataContract 属性,并且它的实例用作 Web 方法之一(操作合同)的参数,它会自动成为消息正文的一部分吗?还是我们也需要 MessageContract 属性?我们目前使用 XmlSerialzation。如何确保 WCF SOAP 消息与现有的 WSE3 服务完全相同?抱歉有这么多问题,但对我来说都很重要。我也在看书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多