Chappell &Associates的负责人David Chappell在他撰写的一篇白皮书《处理多样性:理解.NET Framework 3.5中的WCF通信选项》中,为我们展现了WCF所提供的各种通信方式。
针对分布式系统开发中会遇到的各种通信选项,微软发布的Windows Communication Foundation为其提供了一种单一的编程模型。这一组选项涵盖了从内部处理通信到端对端网络通信的诸多方面。在过去,每一种通信模型都对应了一种特定的编程模型。“如果为多种通信方式提供一个通用的编程模型,就能够帮助开发者有效地处理各种多样性”,David Chappell说道。
白皮书一开始就介绍了两种主要的负责处理多样性的WCF概念:
| 以下是引用片段: 从一开始,WCF的创建者就认识到应用程序会有多个不同的通信需求。同时,他们也确信会有新的通信方式不断出现。为了应对这样的现实问题,WCF提供了一个通用的体系架构,以支持不同的通信方式。这种体系架构最突出的两个理念就是通道与绑定[...]。 |
| 以下是引用片段: 无论是客户端,还是服务,或者两者,通过WCF进行通信的所有软件均依赖于一个或多个通道。[...]通道堆栈基于WCF客户端或服务与它所依赖的通信机制之间进行创建。在堆栈中最底层的通道所做的工作是相同的,即负责将要传递的消息与用来传输该消息的相关机制映射起来。因此,这一最底层的组件通常被称之为“传输通道”。 |
| 以下是引用片段: 通过指定一个特定的绑定,WCF客户端或者服务隐式地创建了实现一组特定通信行为的通道堆栈。[...] 一个特定的WCF接口所定义的服务可以通过该绑定进行访问[...]或者通过多个绑定同时进行访问[...]。 |
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 |
与[其他的]基于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。