因此,如果要学习WCF,你必须找准自己学习的动机与目标,然后合理地安排自己的学习进度表,这才是正确的学习方式。本文试图对WCF的一些基础概念作一些试探性的阐述与分析,并以问答的方式组织,希望能够部分解答一些希望学习WCF,但犹自徘徊在门外的开发者。
1、WCF是什么?
从WCF所处的位置来看,它是包含在.NET 3.0(也包括.NET 3.5)之中的。我们注意比较.NET 3.0与.NET 2.0,其实唯一的区别就是.NET 3.0包含了WCF、WPF、WF(或者还有CardSpace)而已。因此,我们认为WCF是.NET框架的一部分,似乎并不为过。尤为关键的是,WCF并不能脱离.NET框架而单独存在(但非WCF客户端可以调用WCF服务),因此,虽然WCF是微软用以应对SOA解决方案的开发需求而专门推出的,但它并不是例如Spring、Struts那样的框架,也不是像EJB那样的容器或者服务器。微软真正符合SOA企业应用服务器角色的,我想应该是Biztalk Server。
严格的说,WCF就是专门用于服务定制、发布与运行以及消息传递和处理的一组专门类的集合,也就是所谓的“类库”。这些类通过一定方式被组织起来,共同协作,并为开发者提供了一个统一的编程模式。WCF之所以特殊,是在于它所应对的场景与普通的.NET类库不同,它主要用于处理进程间乃至于机器之间消息的传递与处理,同时它引入了SOA的设计思想,以服务的方式公布并运行,以方便客户端跨进程和机器对服务进行调用。实际上,WCF就是微软对于分布式处理的编程技术的集大成者,它将DCOM、Remoting、Web Service、WSE、MSMQ集成在一起,从而降低了分布式系统开发者的学习曲线,并统一了开发标准。
WCF与其它类库还有不同的地方,则在于WCF充分地体现了运行时环境的概念。对于早期使用WCF的开发人员而言,就可能知道如果在.NET 2.0下要开发WCF,还需要专门下载一个Runtime Component 3.0版,其中就包含了WCF、WF等内容。在.NET中一贯存在所谓“宿主”的概念,整个.NET Framework(或者说是CLR)就可以认为是一个大的宿主,就像Java的虚拟机一样。由于WCF对服务有着专门的需求,对于服务端,需要发布和运行服务;对于客户端,则需要调用服务;因而对于开发者,就需要编写定义、发布、运行、调用服务的相关代码。而服务就只能运行在特定的宿主上,这些宿主可以是控制台应用程序进程、Windows或Web应用程序进程,也可以是Windows服务进程,或者为最常用的IIS宿主。在宿主内部,则封装了通道堆栈,其中又包含了对协议、编码、消息传输、代理的处理。而在通道层的顶部,还提供了一个高级运行时,以针对应用程序的开发人员。
因而,我们可以这样认为,WCF是.NET Framework 3.x的一部分,它包含了用于服务定制、发布与运行以及消息传递和处理的运行时环境以及相关类的集合,它提供了在Windows平台下开发和部署服务的SDK。大致组成如下图所示:
2、WCF是怎样运行的?
如果从宏观的角度来分析WCF的运行机制,它的实现并不复杂。WCF的体系架构是基于一种拦截机制来实现的,负责传递和拦截消息的组件为通道,在客户端发出对服务端服务的调用时,首先会通过一个服务代理对象,将调用方提供的对象序列化到消息中,然后该消息则通过通道进行传递。通道不只是包括一个,而是多个通道对消息进行处理,包括传输、消息编码、管理会话、传播事务等,但最底层的通道总是传输通道。这些通道的构成形成了一个通道堆栈。由于对象已经被序列化,因而此时通道传递的消息可以跨进程或机器进行传递,利用传输通道传递到服务端。服务端的构成与客户端基本相似,仍然是通过通道栈中最底层的传输通道接收消息,然后解析消息编码,并一层层地往上传输。在服务端的通道栈之上,则是一个分发器(Dispatcher,或者说是调度器),它会首先对消息进行检查,然后选择一个客户端要调用的操作。在这个过程中,消息会被反序列化。
下图说明了WCF的整个运行过程:
由于WCF通过通道的方式传递消息,整个通道同时担当了侦听器和拦截器的功能,它可以根据服务的定义,在方法执行的前或后执行不同的操作,例如事务、会话管理、安全等。这些操作在WCF中,大多数都可以以Attribute的方式应用到服务契约上,这样的实现方式,就类似于采用了AOP(面向服务编程)的方法为服务提供了大量的基础功能,有助于简化服务开发者的工作。
3、为什么我们要选用WCF?
在Windows平台下,尤其是在.NET平台下开发面向服务的应用程序,或者开发分布式系统,最佳选择就是WCF。为什么呢?原因就在于WCF涵盖了之前微软推出的所有用于分布式开发的技术,包括Remoting、Web Services、WSE、MSMQ等,并以一种统一的编程模式来实现。
WCF既支持具有互操作性的Web服务,也能够实现.NET客户端与.NET服务端的通信,提供了分布式事务的支持,同时在安全性上,它完全遵循了WS-*的标准,此外,它还支持队列服务,可以非常方便地利用消息队列完成异步操作与脱机调用。而这些功能,以前的技术都只是部分的实现。如下表所示:
特性
|
Web Service
|
.NET Remoting
|
Enterprise Services
|
WSE
|
MSMQ
|
WCF
|
具有互操作性的Web服务
|
支持
|
|
|
|
|
支持
|
.NET到.NET的通信
|
|
支持
|
|
|
|
支持
|
分布式事务
|
|
|
支持
|
|
--> |