|
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-*消息。 WCF应用程序之间的二进制通信 适用于WCF到WCF之间的通信 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。[...] |