Posted on 2009-12-23 22:20 Frank Xu Lei 阅读(118) 评论(1) 编辑 收藏 网摘 所属分类: 《WCF技术内幕》翻译, SOA and EAI
Channel Interfaces and Base Types
第6章:通道(Channel)
概述
通道发送和接收消息。通道负责传输和WS-*协议的实现、安全以及事务处理。通道是高组合性的-换句话说,它可以通过多种方式组合以实现应用程序需要的功能。通道是可扩展的,并且内部设计的WCF API也允许开发人员自定义通道。
绝大部分上,通道不会出现在主流的应用程序开发人员使用的API里。从另外一个角度来看,Framework的开发人员,可以创建自定义通道,然后通过这些自定义传输或者协议来传输消息。理解通道内部实现对于应用程序开发人员和framework开发人员来说都十分重要。毕竟,通道是WCF应用程序的核心构件。本章会详细介绍通道的本质,适合读者为应用程序和framework开发人员。
着重指出的是,要构建高质量的通道必须有一个异步接口。如果你还没有接触过异步编程的知识,在编写自定义通道以前学习一下这些知识会事倍功半。我个人认为,最好的学习资料就是Jeffrey Richter的《CLR via C#》(Microsoft Press, 2006)【老徐备注1】
在程序里,通道一般都是和消息通信密切相关的。如果一个WCF应用程序是安全的、可靠的和支持事务处理的,那么这个程序一定是使用一个通道提供安全性,另外一个通道提供可靠性,再一个通道提供事务能力支持。因为每个通道都有自己特定的功能,而大部分程序需要的功能超出了一个通道的能力范围,所以WCF应用程序组织适合的通道在一个堆栈里,然后使用堆栈里提供的功能。几乎没有任何一个产品孤立地使用一个通道。
WCF程序只会使用堆栈顶端的通道。当入栈以后,通道会执行特定的工作,然后在调用堆栈里的下一个通道(或者调用下一个通道,然后在调用返回之前继续做自己的工作)。这里很重要的一点是,一旦消息被发送到堆栈里的通道里,通道堆栈会在其内部推进,或者拉回消息。没有任何外部的控制器来管理在内部通道之间的消息轮转。当一个程序建立了一个通道堆栈,这个堆栈就是一个外部不透明的实体。如你将会在本章里看到的一样,我们也许可以查询通道堆栈里的特定功能,但当第一次接触像通道这样重要的主题的时候,这个与我们希望的完全透明的东西,还差的很远。
当通道在堆栈里组装完毕,它的结构会说明程序的许多特性,并且堆栈里的每个通道在整个程序的功能里都扮演着不同的角色。绝大部分上,通道堆栈在顶部通道接受或者返回一个Message,而堆栈底部通道会从传输层生成或者接受字节流。在接受程序的通道堆栈里,换句话说,底部通道会接受字节流,然后顶部通道会返回一个Message对象。中间发生了什么取决于内部驻留的通道。通常通道堆栈中间的通道都是关于WS-*协议或者安全规范的物理实现。图6-1演示了一个消息发送程序的通道堆栈结构。
图6-1:一个典型的通道堆栈
注意到底部堆栈接受一个Message输入并且输出字节流到传输层。底层通道也会负责特定的传输通信工作。如果是TCP传输,这个通道就会负责socket连接和发送字节流到socket。如果是MSMQ传输,底层通道会负责连接懂啊一个MSMQ队列,然后发送消息到这个队列里。注意到图6-1,传输层之上的通道在消息处理过程中都有不同的作用(例如,事务、安全和可靠性)。
没有一个具体的,万能的通道类型。WCF类型系统包含许多通道类型的定义,并且每个通道类型定义都有特定的目的。例如,所有WCF里支持的传输至少有一个通道类型定义,它们提供了WCF程序通过传输层通信的物理方式。同样,WCF类型系统也包含许多通道类型,它们是可靠性、事务处理和安全等高级特性的物理实现方式。
工厂对象实例化通道对象。大部分情况,工厂对象和通道对象存在一对一的关联。换句话说,每个通道类型都有一个与之对应的工厂类型。没有万能的通道类型,也没有万能的工厂类型。因为通道经常在运行时组织的,所以创建通道的工厂对象也经常是在运行时组织到堆栈里的。在某种意义上说,堆栈里的工厂对象的组织方式表明了通道的组织方式。你会在第7章:“通道管理器”里学习到更详细的内容。现在,我们知道了通道不是在用户的代码中创建的,而是由WCF定义的通道工厂创建的。
老徐备注:
【老徐的博客】
【作 者】:Frank Xu Lei
【地 址】:
【中文论坛】:微软WCF中文技术论坛
【英文论坛】:微软WCF英文技术论坛