《WCF技术内幕》31:第2部分_第6章_通道:概述与正确认识通道2011-06-20 博客园 Frank Xu Lei译概述通道发送和接收消息。通道负责传输和WS-*协议的实现、安全以及事务处理 。通道是高组合性的-换句话说,它可以通过多种方式组合以实现应用程序需要 的功能。通道是可扩展的,并且内部设计的WCF API也允许开发人员自定义通道 。绝大部分上,通道不会出现在主流的应用程序开发人员使用的API里。从另外 一个角度来看,Framework的开发人员,可以创建自定义通道,然后通过这些自 定义传输或者协议来传输消息。理解通道内部实现对于应用程序开发人员和 framework开发人员来说都十分重要。毕竟,通道是WCF应用程序的核心构件。本 章会详细介绍通道的本质,适合读者为应用程序和framework 开发人员。提示:或许你看到过,WCF API是相当复杂的,通道层也不例外。和WCF的其 它部分一样,学习通道包括两个主要部分:学习类型层次和学习执行环境。个人 经验,最好的学习使用通道的方法是花一些时间学习类型层次,并且构建一个简 单的通道,然后插入到WCF基础结构里。在类型层次上花费太多的时间容易迷失 方向,直接自定义一个通道而不知道类型层次关系等于盲人摸象。着重指出的是,要构建高质量的通道必须有一个异步接口。如果你还没有接 触过异步编程的知识,在编写自定义通道以前学习一下这些知识会事半功倍。我 个人认为,最好的学习资料就是Jeffrey Richter的《CLR via C#》 (Microsoft Press, 2006)【老徐备注1】正确认识通道(Channel)在程序里,通道一般都是和消息通信密切相关的。如果一个WCF应用程序是安 全的、可靠的和支持事务处理的,那么这个程序一定是使用一个通道提供安全性 ,另外一个通道提供可靠性,再一个通道提供事务能力支持。因为每个通道都有 自己特定的功能,而大部分程序需要的功能超出了一个通道的能力范围,所以 WCF应用程序组织适合的通道在一个堆栈里,然后使用堆栈里提供的功能。几乎 没有任何一个产品孤立地使用一个通道。WCF程序只会使用堆栈顶端的通道。当入栈以后,通道会执行特定的工作,然 后在调用堆栈里的下一个通道(或者调用下一个通道,然后在调用返回之前继续 做自己的工作)。这里很重要的一点是,一旦消息被发送到堆栈里的通道里,通 道堆栈会在其内部推进,或者拉回消息。没有任何外部的控制器来管理在内部通 道之间的消息轮转。当一个程序建立了一个通道堆栈,这个堆栈就是一个外部不 透明的实体。如你将会在本章里看到的一样,我们也许可以查询通道堆栈里的特 定功能,但当第一次接触像通道这样重要的主题的时候,这个与我们希望的完全 透明的东西,还差的很远。当通道在堆栈里组装完毕,它的结构会说明程序的许多特性,并且堆栈里的 每个通道在整个程序的功能里都扮演着不同的角色。绝大部分上,通道堆栈在顶 部通道接受或者返回一个 Message,而堆栈底部通道会从传输层生成或者接受字 节流。在接受程序的通道堆栈里,换句话说,底部通道会接受字节流,然后顶部 通道会返回一个 Message对象。中间发生了什么取决于内部驻留的通道。通常通 道堆栈中间的通道都是关于WS-*协议或者安全规范的物理实现。图6-1演示了一 个消息发送程序的通道堆栈结构。

图6-1:一个典型的通道堆栈注意到底部堆栈接受一个Message输入并且输出字节流到传输层。底层通道也 会负责特定的传输通信工作。如果是TCP传输,这个通道就会负责socket连接和 发送字节流到socket。如果是MSMQ传输,底层通道会负责连接懂啊一个MSMQ队列 ,然后发送消息到这个队列里。注意到图6-1,传输层之上的通道在消息处理过 程中都有不同的作用(例如,事务、安全和可靠性)。没有一个具体的,万能的通道类型。WCF类型系统包含许多通道类型的定义, 并且每个通道类型定义都有特定的目的。例如,所有WCF里支持的传输至少有一 个通道类型定义,它们提供了WCF程序通过传输层通信的物理方式。同样,WCF类 型系统也包含许多通道类型,它们是可靠性、事务处理和安全等高级特性的物理 实现方式。实例化通道工厂对象实例化通道对象。大部分情况,工厂对象和通道对象存在一对一的 关联。换句话说,每个通道类型都有一个与之对应的工厂类型。没有万能的通道 类型,也没有万能的工厂类型。因为通道经常在运行时组织的,所以创建通道的 工厂对象也经常是在运行时组织到堆栈里的。在某种意义上说,堆栈里的工厂对 象的组织方式表明了通道的组织方式。你会在第7章:“通道管理器”里学习到 更详细的内容。现在,我们知道了通道不是在用户的代码中创建的,而是由WCF 定义的通道工厂创建的。