在.NET Framework 3.5 中的 WCF 通信选项

  • Hartmut Wilms
  • 张逸

2008 年 1 月 24 日

话题:SOA.NET语言 & 开发架构

Chappell & Associates 的负责人David Chappell在他撰写的一篇白皮书《处理多样性:理解.NET Framework 3.5 中的 WCF 通信选项》中,为我们展现了 WCF 所提供的各种通信方式。

针对分布式系统开发中会遇到的各种通信选项,微软发布的Windows Communication Foundation 为其提供了一种单一的编程模型。这一组选项涵盖了从内部处理通信到端对端网络通信的诸多方面。在过去,每一种通信模型都对应了一种特定的编程模型。“如果为多种通信方式提供一个通用的编程模型,就能够帮助开发者有效地处理各种多样性”,David Chappell 说道。

白皮书一开始就介绍了两种主要的负责处理多样性的 WCF 概念:

从一开始,WCF 的创建者就认识到应用程序会有多个不同的通信需求。同时,他们也确信会有新的通信方式不断出现。为了应对这样的现实问题,WCF 提供了一个通用的体系架构,以支持不同的通信方式。这种体系架构最突出的两个理念就是通道与绑定 [...]。

在 WCF 中,每一次交互可以被看作是一次消息交换。消息包含了一次访问负载以及在一次传输过程任意数量的基础设施数据。为了处理不同的现有以及未来的通信方式,WCF 引入了通道模型。每种通道对应一个特定的基础设施方向,例如安全性或者可靠性。一套完整的基础设施需要一个单独的通信选项,而该选项则由预先定义或自定义的通道堆栈进行处理:

无论是客户端,还是服务,或者两者,通过 WCF 进行通信的所有软件均依赖于一个或多个通道。[...] 通道堆栈基于 WCF 客户端或服务与它所依赖的通信机制之间进行创建。在堆栈中最底层的通道所做的工作是相同的,即负责将要传递的消息与用来传输该消息的相关机制映射起来。因此,这一最底层的组件通常被称之为“传输通道”。

WCF 通过引入绑定的方式允许对通道堆栈进行便捷的配置与定义:

通过指定一个特定的绑定,WCF 客户端或者服务隐式地创建了实现一组特定通信行为的通道堆栈。[...] 一个特定的 WCF 接口所定义的服务可以通过该绑定进行访问 [...] 或者通过多个绑定同时进行访问 [...]。

下面的内容阐释了 David Chappell 所介绍的.NET Framework 3.5 提供的所有通信选项的体系架构:

SOAP 和 WS-* Web Service

作为微软推出的针对面向服务体系架构的技术,WCF 的构建目的在于开发 SOAP/WS-* 的 Web Service:

  • WCF 允许传递基于任意传输类型例如 HTTP 或 TCP 的 SOAP/WS-* 消息。
  • 支持最重要的 WS- 规格 - 在.NET Framework 3.5 的 MSDN 文档中,提供了一个扩展的概要介绍《由系统提供的互操作性绑定支持的 Web Service 协议》。
  • 能够强制要求服务遵循 Web Services Interoperability Organization (WS-I) Basic Profile 1.0。
  • WCF 针对通用的 Web 服务场景提供了一套预定义的绑定。

WCF 应用程序之间的二进制通信

适用于 WCF 到 WCF 之间的通信

WCF 支持使用更加有效的二进制编码方式进行通信。不仅可以通过 HTTP 传递标准的基于 XML 的 SOAP 消息,开发者还可以选择直接通过 TCP 传递在表示方式上更加有效的相同的信息。

REST 化(RESTful)的 Web Service

由于 REST 方式的 Web Service 越来越普及,因此在.NET Framework 3.5 中,WCF 也支持 REST 方式。事实上,虽然 WCF 的第一个版本专注于基于 SOAP 的服务,但是“通用的通道模型完全能够添加对 REST 通信最直接的支持”。首先,WCF 消息必须去除 SOAP 信封以及标头,这一点可以使用新增加的 WebHttpBinding:

与 [其他的] 基于 HTTP 的绑定不同 [...],该绑定使用了一个编码项 WebMessageEncoding,这是.NET Framework 3.5 版本中的 WCF 新增加的特性。该选项不会添加或移除 SOAP 标头。相反,它会为呈现的内容实现三种不同的选项:基于文本的 XML 编码,JSON 编码和不透明的二进制编码,后者对于某些场景会非常有用,例如传递 JPEG 文件。作为一种 HTTP 绑定,出于安全性考虑,WebHttpBinding 同样可以被配置为使用 HTTPS。

操作会被映射为 HTTP 动作,例如 GET,PUT,POST 或者 DELETE,可以通过 WebGet 或 WebInvoke 特性在 WCF 的服务契约上进行标记。因为 REST 方式“必然意味着要操作 URIs”,WCF 提供某种手段来负责管理“大量相似的 URIs”:URI 模板。“这些模板的目的在于简化开发者表示 URI 模式以及处理匹配这些模式的 UIRs 的工作”

POX 与 Syndication(RSS,ATOM)

使用 WCF 的 REST 模式,可以发送 POX(Plain Old XML)消息或者使用联合(Syndication)格式。

POX,RSS 和 ATOM 均为格式,而非协议。正因为此,并不需要特定的 WCF 绑定来使用它们。通常,它们都可以直接通过 HTTP 进行传送,由于没有 SOAP 标头,因此绑定的最佳选择是使用 WebHttpBinding。

商务营运(LOB)应用程序的通信

WCF 支持正在开发的客户端与不提供 Web Service 接口的应用程序之间的通信:

对此,一个重要的范例就是与 LOB 应用程序的通信,例如 SAP。[...]

对此的支持正是 WCF Line-of-Business (LOB) Adapter SDK 的目标。正如“SDK”其名所示,该技术自身并不包含任何适配器。相反,它提供了一些工具和运行时环境以帮助创建面向 LOB 应用程序的适配器。然后,应用程序的开发者就可以使用这些适配器创建 WCF 客户端,以调用 LOB 应用程序的服务,就好似该应用程序就是一个普通的 WCF 服务那样。

通过消息队列进行通信

为了使用消息队列进行通信

[...] WCF 提供了一个 MSMQ 传输通道。若要使用队列通信,开发者可以创建一个标准的 WCF 服务,并按照通常的方式为该服务接口以及方法分别标记 ServiceContract 标志和 OperationContract 标志。同时,应该将接口中每个操作的 OperationContract 标志的 IsOneWay 属性标记为 true。[...]

只有二进制消息可以通过 MSMQ 进行传送,该消息既可以被 SOAP 信封所包裹,也可以不使用 SOAP 信封。

通过 Windows 点对点(Peer-To-Peer)网络的通信

Windows 点对点网络主要用于协作场景。在端系统中,单台 PC 机同时作为客户端与服务器(多个端点)

通常,WCF 应用程序可以通过指定正确的绑定使用 Windows 端对端网络。NetPeerTcpBinding[...] 依赖于指定了端通信的传输通道。该绑定也可以被置于 PnrpPeerResolver 通道中,通过它处理传送时的寻址操作,以使得消息能够传递到指定的端系统图中。

内进程通信

WCF 支持 [同一台机器进程之间的通信],使用的绑定为 NetNamedPipeBinding[...]。 它并不依赖于实现了网络协议如 HTTP 或 TCP 的传输通道,而是使用命名管道进行通信的传输通道,这是内进程通信的一个标准 Windows 机制。

自定义通信

WCF 提供了多种扩展与定制通信选项的途径。开发者可以创建定制通道,定制绑定以及自定义现有的绑定。Davide Chappell 在文章Microsoft BizTalk Services中“提供了对此技术的有趣的阐释”。

根据 David Chappell 所述,“针对通信的一个具有通用目的的平台意义非凡”。WCF“利用一个通用的框架提供对多种通信方式的支持”,并且易于扩展和定制。

查看英文原文:WCF Communication Options in the .NET Framework 3.5


译者介绍:张逸(Bruce Zhang),毕业于四川大学计算机学院,文学爱好者,微软最有价值专家(MVP)。曾先后任职中兴通讯重庆研究所以及惠普 GDCC。拥有 10 年左右的软件开发与 5 年左右的软件架构设计经验,熟悉 C#,ASP.NET,Web Service,.NET Remoting,WCF 等技术。在面向对象领域具有一定造诣,特别是设计模式、测试驱动开发、极限编程与 UML 等技术与思想的运用。目前,主要从事 SOA 企业信息解决方案的设计与研究。著作 / 译作包括《软件设计精要与模式》、《WCF 服务编程》。他的个人主页为 http://www.brucezhang.com。

SOA.NET语言 & 开发架构