WCF(Windows
Communications Foundation,原先称为Indigo)是微软的下一代编程平台和Runtime系统,用于构建、配置及部署网络分布式服务。它与WCF 运行时环境及代表其主要编程接口的System.ServiceModel命名空间等有关产品一起为分布式系统提供技术支持。
为什么需要WCF
当前的分布式系统技术是无数成功的应用程序的基础,其中最主要的是ASP.NET Web服务(ASMX)、增强Web服务(WSE)扩展、微软消息队列(MSMQ)、企业服务/COM+Runtime环境以及.NET Remoting。那么,这些技术是否存在着什么重大缺陷从而使得微软把它们统统换掉呢?没有,惟一的问题就是这些技术太多了。
使用ASMX和WSE,你就可以借助支持跨平台协同操作的Web服务和Web服务客户程序,构建功能强大、协同操作的面向服务的应用程序,并且可以通过松散耦合,构建相对简单的服务和版本控制策略。利用MSMQ,你就有了一种功能强大的机制,可以获得可扩展、耐用、灵活的队列消息,负责把数据从一个地方可靠地传送到另一个地方。企业服务提供了在分布式环境下执行相关工作的多方集成事务的功能; 允许限制对有限、共享资源的访问; 允许集中对象实例,从而优化对初始化成本高昂的资源的访问; 在事件方面拥有发布/订阅机制; 拥有丰富的安全模型,而且建立在成熟、平台集成、安全和快速的传输机制上。最后但并非最不重要的一点是,Remoting是通用语言运行时环境(CLR)集成机制,用于跨应用域边界与对象进行通信,因为非常灵活的扩展模型而备受欢迎,这让开发人员可以淘汰与取代传输机制、代理机制以及通信通道的工作方式。
所有这些都好,惟一的问题就是,你往往要为到底该使用其中的哪项根本性技术进行选择。如果你需要企业服务的任何特性,并且决定使用它,那么你的实现策略会与你使用ASMX时大不相同。如果你需要非常可靠的消息传送功能,并决定通过MSMQ发送消息,而不是通过普通HTTP发送消息,那么你的代码会与通过面向方法的代理调用截然不同,除非你自己添加了一些衔接代码(plumbing code),或者使用企业服务的队列组件(Queued Components)特性(这又出现了前面所述的缺点)。
WCF的目标就是,你再也不必事先做出这样的技术选择,你可以在单一技术平台上满足任何组合的这类要求,没有任何阻碍,这个平台就是WCF。如果你想使用支持会话和事务流的可靠通信机制来构建Web服务,并且可以扩展该服务,以便能够检查进入系统的原始消息,那么使用WCF就非常容易做到这一点。虽然如今完成这项任务(而这不仅仅针对微软平台)并非完全不可能,但要求开发人员对所有上述技术掌握丰富的系统级背景知识,而且需要相当长的开发时间。
WCF的价值在于,它可望提高开发人员的生产力,因为他们只要掌握一种编程模型,这种编程模型整合了ASMX、WSE、企业服务、MSMQ和Remoting的丰富特性。另外别忘了这一点: WCF是微软实现其在过去五年与业界合作伙伴共同开发的所有这些Web服务标准的机制——这有望确保广泛的互操作性,适用于诸多平台、运行时环境和编程语言。
WCF的ABC
“ABC”是理解WCF的秘诀,“ABC”也是理解WCF服务端点(endpoint)如何组合的关键所在。
● A代表位置(Address): 服务在哪里?
● B代表绑定(Binding): 我如何与该服务联系?
● C代表契约(Contract): 该服务能为我做什么?
对Web服务描述语言(WSDL)很了解的Web服务爱好者很容易看出这三个概念对应WSDL的三个抽象层。
● A代表位置(Address)——用WSDL:Service部分表示,负责把WSDL:Binding连接到具体的服务端点位置。
● B代表绑定(Binding)——用WSDL:Binding部分表示,负责把WSDL:PortType契约描述绑定到实际传输机制、信封格式及相关策略上。
● C代表契约(Contract)——用WSDL:PortType、WSDL:Message和WSDL:Type部分表示,描述了类型、消息、消息交换模式及操作。
“ABC”还意味着编写(及配置)WCF服务总是涉及三个步骤:
1. 定义契约,并实现在服务中。
2. 选择或者定义一种服务绑定,它选择了传输机制以及服务质量、安全及其他选项。
3. 可以通过把契约绑定(使用绑定定义,由此得名)到网络地址上,来部署针对该契约的端点。
值得一提的是,这三个元素相互独立。一个契约可以支持多个绑定,而一个绑定也可以支持多个契约。一个服务可以同时有多个端点(契约与位置绑定在一起)共存、可以使用。所以,如果你希望通过HTTP呈现服务,并使用SOAP 1.1以获得最大的互操作性,还希望通过TCP,使用二进制编码来呈现服务,以获得最高性能,这时出现的两个端点可以在同一个服务上面共存。
当然,不是所有的绑定都能满足某个特定服务契约或者服务实现的要求。譬如说,如果某服务确实绝对离不开某些安全方面、可靠消息传送、事务流或其他特性,它可以要求: 用于呈现端点的任何绑定必须支持它们。如果绑定不支持所要求的特性,WCF运行时环境会检测出性能不匹配,并拒绝提供服务。