现在的位置: 首页 > 综合 > 正文

WCF基础知识问与答

2013年01月24日 ⁄ 综合 ⁄ 共 2562字 ⁄ 字号 评论关闭
“学以致用”,如果仅仅是希望能够在项目中合理地应用WCF,那么对于程序员而言,可以有两种选择,一种是“知其然而不知其所以然”,只要掌握了WCF的基础知识,那么对于一般的应用就足够了。要做到这一点就很容易了,微软秉承了一贯的方式,将WCF这门技术优雅地呈现给开发者,封装了复杂的实现逻辑,提供了易于调用的类库和相关的工具,使得开发者能够快速地完成WCF程序的开发。另外一种方式自然就是深度挖掘WCF的内部实现了,这是对WCF专家提出的要求。如果我们要应用WCF实现SOA解决方案,就会遭遇许多WCF的高级应用,如何合理、有效地应用WCF,并根据项目实际情况对WCF进行扩展,就成为了WCF专家必须解决的难题。

因此,如果要学习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。大致组成如下图所示:
wcfbasic01.gif 


2、WCF是怎样运行的?

如果从宏观的角度来分析WCF的运行机制,它的实现并不复杂。WCF的体系架构是基于一种拦截机制来实现的,负责传递和拦截消息的组件为通道,在客户端发出对服务端服务的调用时,首先会通过一个服务代理对象,将调用方提供的对象序列化到消息中,然后该消息则通过通道进行传递。通道不只是包括一个,而是多个通道对消息进行处理,包括传输、消息编码、管理会话、传播事务等,但最底层的通道总是传输通道。这些通道的构成形成了一个通道堆栈。由于对象已经被序列化,因而此时通道传递的消息可以跨进程或机器进行传递,利用传输通道传递到服务端。服务端的构成与客户端基本相似,仍然是通过通道栈中最底层的传输通道接收消息,然后解析消息编码,并一层层地往上传输。在服务端的通道栈之上,则是一个分发器(Dispatcher,或者说是调度器),它会首先对消息进行检查,然后选择一个客户端要调用的操作。在这个过程中,消息会被反序列化。

下图说明了WCF的整个运行过程:

wcfbasic02.gif 


由于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的通信
 
支持
 
 
 
支持
分布式事务
 
 
支持
 
-->

作者:

抱歉!评论已关闭.