WCF体系架构

1、WCF体系架构

WCF提供了对可靠性、事务性、并发管理、安全性以及实例激活等技术的有力支持,它们均依赖于基于拦截机制的WCF体系架构(WCF Architecture)。通过代理与客户端的交互意味着WCF总是处于服务与客户端之间,拦截所有的调用,执行调用前和调用后的处理。当代理将调用栈帧(Stack Frame)序列化到消息中,并将消息通过通道链向下传递时,WCF就开始执行拦截。通道相当于一个拦截器,目的在于执行一个特定的任务。每个客户端通道都会执行消息的调用前处理。链的组成与结构主要依赖于绑定。例如,一个通道对消息编码(二进制格式、文本格式或者MTOM),另一个通道传递安全的调用上下文;还有一个通道传播客户端的事务,一个通道管理可靠会话,另一个通道对消息正文(Message Body)加密(如果进行了配置),诸如此类。客户端的最后一个通道是传输通道,根据配置的传输方式发送消息给宿主。

在宿主端,消息同样通过通道链进行传输,它会对消息执行宿主端的调用前处理。宿主端的第一个通道是传输通道,接收传输过来的消息。随后的通道执行不同的任务,例如消息正文的解密、消息的解码、参与传播事务、设置安全准则、管理会话、激活服务实例。宿主端的最后一个通道负责将消息传递给分发器(Dispatcher)。分发器将消息转换到一个栈帧,并调用服务实例。执行顺序如图1所示。

图1:WCF体系架构

服务并不知道它是否被本地客户端调用。事实上,服务会被本地客户端 —— 分发器调用。客户端与服务端的拦截器确保了它们能够获得运行时环境,以便于它们执行正确的操作。服务实例会执行调用,然后将控制权(Control)返回给分发器。分发器负责将返回值以及错误信息(如果存在)转换为一条返回消息。分发器获得控制权,执行的过程则刚好相反:分发器通过宿主端通道传递消息,执行调用后的处理,例如管理事务、停用实例、回复消息的编码与加密等。为了执行客户端调用后的处理,包括解密、解码、提交或取消事务等任务,传输通道会将返回消息发送到客户端通道。最后一个通道将消息传递给代理。代理将返回消息转化到栈帧,然后将控制权返回给客户端。

特别值得注意的是,体系架构中的所有要点均与可扩展性息息相关。我们可以为专有交互定制通道,为实例管理定制行为,以及定制安全行为等。事实上,WCF提供的标准功能都能够通过相同的可扩展模式实现。

2、宿主体系架构

如何将与技术无关的面向服务交互转换为CLR接口与类。宿主(host)消除了两者之间的鸿沟,搭建了相互之间转换的桥梁。每个.NET宿主进程都包含了多个应用程序域。每个应用程序域则包含了零到多个服务宿主实例(Service Host Instance)。每个服务宿主实例专门对应于一个特殊的服务类型(一个配置文件中的Service段)。创建一个宿主实例,实际上就是为对应于基地址的宿主机器的类型,注册一个包含了所有的终结点的服务宿主实例(一个ServiceHost对象)。每个服务宿主实例拥有零到多个上下文(Context)。上下文是服务实例(Service Instance)最核心的执行范围。一个上下文最多只能与一个服务实例关联,这意味着上下文可能为空,不包含任何服务实例。关于服务实例(对象)的管理有三种:单调服务(PerCall Service),会话服务(Persession Service),单例服务(Singlton Service)。

WCF宿主体系架构如图2所示。

图2:WCF宿主体系架构

关于WCF上下文

WCF上下文的概念与企业服务上下文(Enterprise Services Context)或者.NET上下文绑定对象(Context-Bound Object)的上下文概念相似。

WCF上下文是一个运行环境,它将服务宿主与公开本地CLR类型为服务的上下文组合在一起。当消息经由通道进行传递时,宿主会将消息映射到新的或者已有的上下文(内部包含服务对象实例),然后通过上下文处理调用。

上下文是一种比域更小的运行环境。更多解释可以参考.net上下文。

一种参考解释:上下文提供了一种逻辑线程,我们说回调实现了服务端和客户端的联合,这也就不可避免的让服务端的线程和客户端的线程联合在一起,我们的业务逻辑的执行往往需要在这两个线程中执行,出于折中考虑,WCF提出了上下文的机制,可以简单的理解为,这种机制的提出,屏蔽了服务端线程和客户端线程的差异,使得业务逻辑的执行好象是在一个线程中执行。因此,当我们在某一端,譬如服务端执行某些操作的时候可以获取客户端的一些相关对象。譬如,操作上下文,我们在编码的时候,也许用到过,OperationContext.Current.GetCallbackChannel();,但是还是请你注意,就象这个操作的涵义本身,它获取的不是实现回调操作的对象而是一个回调通道对象。但是这个Channel对象可以跟回调对象暗中通信。我们体会不到这中差异,感觉就象是我们在操作回调对象。

3、使用通道

我们可以直接使用通道调用服务的操作,而无须借助于代理类。ChannelFactroy<T>类(及其支持类型)有助于创建代理。

4、可靠性

WCF与其它面向服务技术最大的区别在于传输可靠性(Transport reliability)与消息可靠性(Message Reliability)。传输可靠性在网络数据包层提供了点对点保证传递(Point-to-Point Guaranteed Delivery),以确保数据包的顺序无误。点对点要求客户端与服务直接连接。传输可靠性不会受到网络连接的中断或其他通信问题的影响。

消息可靠性负责处理消息层的可靠性,它与传输消息的数据包数量无关。消息可靠性提供了端到端保证传递(End-to-End Guaranted Delivery)。确保消息的顺序准确无误。消息可靠性与引入的中间方的数量无关,与网络跳数的数量也无关。

配置可靠性(传输)

一个特定的邦定可以支持可靠性,也可以不支持可靠性。可以通过设置邦定的ReliableSession属性类实现。

有序传递(Orderd Delivery)

消息可靠性确保了消息的有序传递,允许消息按照发送顺序而非接收顺序执行。此外,它保证消息只会被传递一次。

WCF允许启用可靠性,而不启用有序传递。此时,消息按照接收他们的顺序进行传递。如果同时启用了可靠性和有序传递,则所有的邦定的默认值均支持可靠性。

有序传递使用WCF提供的DeliveryRequirement特性设置。

posted @ 2008-07-19 21:53  bluealarm  阅读(402)  评论(0)    收藏  举报