3.1.4 WCF的绑定模型
在上面的案例演示中,通过简单的几行代码就完成了一个完整消息交换过程。在这个例子中涉及了一系列重要的对象,比如信道(Channel)、信道监听器(Channel Manager)、信道工厂(Channel Factory)等,这些是整个绑定模型构成不可或缺的元素。他们相互协作组成了如图3-6所示的WCF绑定模型。
图3-6 WCF绑定模型
在整个绑定模型中,信道和信道栈位于最底层。信道栈是消息通信的通道,组成信道栈的各个信道专注于一个具体的消息处理功能的实现。按照提供功能的不同,可以将信道分成3类:传输信道(Transport Channel)、消息编码信道(Message Encoding Channel)和协议信道(Protocol Channel)。传输信道实现了基于某种网络协议(HTTP、HTTPS、TCP等)的消息传输;消息编码实现了对消息的编码,常见的消息编码方式有:Text/XML、Binary和MTOM;而协议信道则实现WCF对若干WS-*协议的支持,比如WS-Security、WS-RM、WS-AT等。
在WCF中,信道通过信道管理器(ChannelManager)创建。对于信道管理器,读者可能有点陌生,不过应该还记得这两个对象:信道监听器(ChannelListener)和信道工厂(ChannelFactory)。实际上,信道管理器是信道监听器和信道工厂的统称。由于它在客户端和服务端的作用不尽相同,信道管理器在服务端和客户端具有不同的名称。服务端的信道管理器的作用在于创建信道栈监听请求、接收消息,所以称为信道监听器;而客户端的信道管理器在于创建信道进行请求消息的发送和回复消息的接收,所以被称为信道工厂。
一般来讲,信道管理器,无论是信道监听器还是信道工厂,都对应着一个绑定元素(Binding Element),绑定元素负责相应信道管理器的创建。信道管理器是信道的创建者,而绑定元素又是信道管理器的创建者。绑定元素,顾名思义,就是组成绑定对象的元素。从本质上讲,每一个绑定,就是一组绑定元素的有序集合,绑定元素的构成和次序决定绑定的特性与能力。
我们所说的信道栈,指的是若干相关的信道按照一定的次序排列组成的一个消息流通的管道。由于信道的创建者是信道管理器,所以信道管理者的次序决定信道的次序。依此类推,信道管理器栈中每个信道管理器的先后次序由构成绑定对象的所有绑定元素的次序决定。但是绑定元素的先后次序又是如何决定的呢?那就须要使用到另一个有用的对象:绑定上下文(Binding Context)对象,一般来说,一个绑定上下文维护着基于该绑定对象当前绑定元素的有序列表,可以很容易地定位到下一个绑定元素。