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

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。


你可能感兴趣的:(在.NET Framework 3.5中的WCF通信选项)