首页 / 软件开发 / .NET编程技术 / 《WCF技术内幕》37:第2部分_第7章_通道管理器:概述和通道管理器的概念
《WCF技术内幕》37:第2部分_第7章_通道管理器:概述和通道管理器的概念2011-06-20 博客园 Frank Xu Lei译概述用户代码不能直接创建通道;这些工作由特定的工厂类型完成。虽然这些工 厂对象不是通道,但是通常它们也被认为是通道层的一部分。在第6章“通道” 里,我引入了设计模式【老徐备注】(Erich Gamma等, Addison- Wesley, 1995)的概念,并把这种特殊的类型的称为通道工厂。在Windows Communication Foundation (WCF)的类型系统中,通道工厂有特殊的名字,这些 名称与发送者和接收者的命名不同。在接收端,这些类型被称作通道侦听器 (channel listeners)。在发送端,这些类型被称作通道工厂(channel factories). 虽然通道侦听器和通道工厂拥有相同的特性和功能,但是它们却 包含不同的对象和行为模型。当放在一起的时候,它们被称作通道管理器。本章 就会介绍通道管理器的内部类型:通道侦听器和通道工厂。你会了解这些类型的 基本知识,以及它们的对象模型,然后我们会学习如何创建自定义通道的例子。 本章会给出部分代码,完整的代码直到下一章“绑定”才会全部给出,因为创建 通道要使用到Binding。。通道是WCF程序实现消息功能的物理方式,而通道工厂和通道侦听器是WCF程 序创建消息功能的方式。正如没有万能的通道类型,也没有万能的通道工厂或者 通道侦听器。通道可以根据功能来划分(例如,WS-ReliableMessaging、 TCP/IP传输等等),通道管理器也可以更具他们创建的通道功能划分,比如, WS-ReliableMessaging通道是由WS- ReliableMessaging通道管理器创建的,而 且相同的通道管理器不会重复创建通道。这并不是说一个通道管理器只创建一种类型的通道。恰恰相反,通道管理器 可以创建多种不同的通道,但是这些通道会驻留在一个特定的功能组里。很明显 的一点就是,通道管理器创建的通道类型只是形状方面存在差别。有时候,通道 管理器甚至可以创建类型和形状一样的通道(例如,双工通道)通道管理器与通道拥有许多相同的特性。因为通道在运行时会组织在一个堆 栈里,所以通道管理器也会被组织到对站立。某种意义上说,堆栈里的通道管理 器的组织情况就是通道的组织情况。通道管理器实现了ICommunicationObject接 口,而且拥有第6章里所述的通道状态机。更进一步说,它们也实现了查询可用 通道的机制。通道管理器的概念所有的通道管理器都继承自一个抽象基类型: System.ServiceModel.Channels. ChannelManagerBase。类名没有体现出这个类 型的目的,从名字上看,一种猜测就是ChannelManagerBase类型是追踪通道管理 器创建的通道的一种方式。在早期的WCF(那时被称为Indigo),确实是这个目 的。早期设计使得通道的状态和生命周期与通道管理器对象的状态和生命周期紧 密耦合在一起。例如,当一个通道管理器关闭的时候,它也会关闭所有创建的通 道实例。对于发送者可以使用这个模型,但是对于接收者来说就不是那么完美了,因 为接收者对于一个统一资源标识符(URI)只能有一个通道侦听器。接收者经常 需要创建新的通道侦听器堆栈,并且关闭现有的侦听器堆栈。因为关闭一个接收 通道可能执行一些其它工作(比如,WS-RM消息,提交或中断事务等等),所以 关闭对应的通道侦听器就需要花费很长时间。如果通道和通道侦听器没有紧密耦 合,就可以关闭当前的侦听器,完成当前的工作,然后启动一个新的通道侦听器 去处理新的消息。WCF团队在第一个版本里使用了这个模型,主要是因为它能给 接收程序带来更好的吞吐量。本质上,早期的通道管理器的概念在发送者上依然有效。 ChannelManagerBase 类型不在管理通道的工作,作为替代,在通道工厂的类型 层次中,它们会负责管理通道。因为这个改变,ChannelManagerBase类型就成为 一个强制通道管理器实现通道状态机、实现查询机制、传递Binding超时属性给 通道的简单方式。