3.1.1 信道(Channel)与信道栈(Channel Stack)
在信道层,若干信道逐个相连,成为一个信道栈。WCF采用基于消息的通信手段,信道栈提供一个消息传输和处理的通道。关于信道栈的作用,可以打个比方:比如有一个为居民提供饮用水的自来水厂,它的任务就是抽取自然水源,进行必要的净化处理,最终输送到居民区。净化处理的流程可能是这样的:天然水源被汲取到一个蓄水池中先进行杂质的过滤(我们称这个池为过滤池);被过滤后的水流到第二个池子中进行消毒处理(我们称这个池为消毒池);被消毒处理的水流到第三个池子中进行水质软化处理(我们称这个池为软化池);最终水通过自来水管道流到居民的家中。
WCF中信道栈就相当于一个自来水厂,而构成信道栈的一个个信道就相当上面提到的过滤池、消毒池、软化池,以及自来水管道。唯一不同的是,自来水厂处理的是水,而信道栈处理的是消息(Message)。这样设计的最大好处就是具有很强的可扩展性,水的净化须要进行多次处理,对于消息处理来说,不可能、也没有必要设计出一种万能信道完成所有的消息处理任务。我们更希望的方式是让一个信道专注于某单一功能的实现,通过对信道有序、合理的组合去实现实际的消息处理功能。
进一步拿自来水厂举例,因为水厂的目的旨在为居民提供饮用水,所以从水厂到居民住所之间的自来水管道是必须的,至于中间的环节,过滤、消毒、软化、……在水质良好的情况下某些流程可能就显得不那么必要了。与此类似,对于WCF的信道栈来说,有两种信道是必须的:传输信道(Transport Channel)和消息编码信道(Message Encoding Channel)。原因很简单,信道栈的最终任务总是实现对消息的传输,传输信道肯定是必须的;在传输之前须要对消息进行编码,消息编码功能通过消息编码信道实现。所以,最简单的信道栈由传输信道和消息编码信道组成,如图3-1所示。
图3-1 基于传输信道和消息编码信道组成的信道栈
WCF采用完全基于消息的通信方式,所有功能,无论是与业务有关的,还是与业务无关的,都是通过消息交换来实现的。除了最基本的消息编码和传输之外,其他的一些功能也需要通过在消息交换过程中添加一些相应的消息处理操作来实现,典型的功能包括:
● 事务流转(Transaction Flowing):将从客户端开始的事务流转到服务端,从而将服务的执行纳入该事务。
● 安全传输(Tranfer Security):保证数据包或消息的安全,避免被恶意篡改与窥视等。
● 可靠传输(Reliab Messaging):网络环境不好的情况下保证数据包或消息的可靠、有序传输。
这些特殊的功能也通过相应的信道来承载。说得专业一点,WCF是遵循WS-*标准的,WS-*通过一系列的协议制定了一套业界普遍遵循的Web Service标准,使得不同厂商、不同平台之间的互操作成为可能。WCF对最新的WS-*提供了支持,随着WS-*的逐步完善,WCF也会与之保持同步。绝大部分WS-*协议的支持都是通过在信道栈中添加相应的信道实现的,所以我们把这样的信道称为协议信道(Protocol Channel)。必需的传输信道和消息编码信道,加上可选的协议信道组成了一个更加完整的、功能更加强劲的信道栈。如图3-2所示,在传输信道和消息编码信道之上,WS-Security实现了消息层的安全;WS-RM (WS-Reliable Messaging)实现了可靠消息通信;WS-AT(WS-Atomic Transaction)实现了分布式的事务支持。
图3-2 传输信道、消息编码信道和协议信道组成的信道栈