WCF系列学习笔记3之通道模型

WCF通道模型

绑定的本质是一个配置好的通道栈,为了方便程序员专著与业务逻辑,WCF提高了一些烈的绑定。

无论交互的另一方具体位置在哪里,WCF都会为消息的发送和接收建立一个完整的消息管道,这个消息管道也成为通道栈,通道栈中的每一个通道组建,都会有机会对消息进行处理,而整个通道栈是可编辑并且可插入的,这就确保了WCF的通道模型具有相当大的灵活性,WCF通道模型是完全和上层程序隔离的,任何一个服务/客户端都可以轻松地配置到不同的通道模型上去。

通道模型可以被划分为上下两个部分,上面部分的通道被称为协议通道,而下部分的通道称为传输通道,一个通道栈可以拥有任意个协议通道,但一般只拥有一个传输通道,传输通道负责把消息进行编码并且发送到远端,编码时传输通道需要使用通道栈的编码其,一般而言,协议通道负责维护消息的非业务逻辑功能,这样的功能包括:事务,日志,可靠消息,安全性等,程序员可自定义协议通道并且插入到通道栈中,在一个通道栈中,必须包含至少一个传输通道和编码器,传输通道负责消息的编码和发送,具体到,传输通道会尝试从BindingContext对象查找编码器,如果没有找到则会使用默认的编码器,在完成消息的编码之后,传输通道负责把消息发送到远端,这里不同传输通道将会使用不同的传输协议,例如HTTP,TCP,IPC等

 

消息交换模式和通道形状

站在消息传输层面,WCF一共支持六钟消息交互模式,分别为:数据报模式,请求-相应模式,双工模式,会话数据报模式,会话响应-请求模式和会话双工模式,一个通道可以支持其中一种或几种交互模式,通道通过通道形状,来实现具体的消息交互模式。

所谓通道的形状,指的是定义了发送,接受消息动作的10个接口,他们均继承在IChannel借口,这10 个接口分别为IInputChannel,IOutputChannel,IRequestChannel,IreplyChannel,IDuplexChanel,IInputSessionChannel,IOutputSessionChannel,IRequestSessionChannel,IReplySessionChannel和IDuplexSessionChannel.

 

  1. 数据报模式:数据报模式指的是发送端负责把消息发送给对方并且受到确认消息后,就完成消息交互的方式,在这种情况下,发送放唯一能确定的就是消息发送成功,而对于消息是否最终到达服务的终结点,是否成功处理,返回结果如何都一无所知,采用数据报模式的客户段通道实现了IOutputChannel接口,而采用数据报模式的服务端则实现IInputChannel接口,在实际项目中,直接使用数据报消息的模式的机会不多,
  2. 请求-相应模式:客户端会发送一个消息并且接受一个返回消息来完成一次交互,请求响应模式可以看作一中特殊的双工模式,在该模式中,消息的发起端必然是客户段,并且从服务端返回到只有一条消息,客户端在发送出消息或会阻止当前线程并且等待服务端返回消息,这样的模式很实用与HTTP协议,为了实现请求相应模式,客户段同亨需要实现IRequestChannel接口,而服务端则需要实现IReplyChannel接口。
  3. 双工模式:客户段和服务段可以任意地向对方发送消息,而对象也可以任意的次序来接受消息,在这种模式下,发送端和接收端的概念变得不再使用,取而代之的是通行的两个端点,为了实现双工模式,通信段需要实现IDuplexChannel接口,他实际上是IInputChannel 和IOutputChannel接口,并且使用他们来实现接受和发送消息,也可以使用他们的组合来代替,
  4. 带会话模式的数据报模式,请求-响应模式和双工模式:从信道层面来说,会话的概念类似于网络协议中的连接概念,带会话的通信模式类似于面向连接的网络协议,而不带会话的通信模式相对于无连接的网络协议,带会话的三个通道模式中使用的通道形状是:IInputSesssionChannel和IOutputSessionChannel,IRequestSessionChannel, IReplySessionChannel,IDuplexSessionChannel。在通道目标模型中,每个逻辑会话都会表现为一个会话通道的实例,有客户段创建并且在服务段接受的每个新会话都会与每一端的新会话通道相互对应,他们之间的区别见图。
  5. 通道形状的改变:在使用CustomBinding时,通信模式和通信协议是密切相关的,例如在使用HTTP协议进行消息传输时,受到协议的限制,数据报模式和双工模式并不能被使用,这个问题到解决方法就是进行通道的形状改变,通道形状的改变,指的是在传输通道上层添加特定的通达协议,来强制时用某种传输通道不支持的传输模式,
  6. 通道形状和上层服务协议:通道管理器,在WCF中一共有两种通道管理器,一种是IChannelListener<T>和IChannelFactory<T>接口.IChannelListner负责接收段的消息交互工作,这些通道管理器负责侦听消息,建立通道栈,并且提供通道栈顶层通道的引用,大多数情况下,不需要直接使用IChannelListener<T>来实现通道的管理。使用IChannelListener<T>如下:
  7. 代码
    1 7. ChannelListener<IReplyChannel>listener=Binding.BuildChannelListener<IReplyChannel>(new Uri(http://localhost:8080/RequestReplyService), new BindingParameterCollection());
    2  Listener.open();
    3 IReplyChannel replyChannel=new Listener.AcceptChannel(); replyChannel.open();
    4  

     

          与IChannelListener<T>对应的是IChaanelFactory<T>这个接口,这个管理器负责在发送端控制消息的发送,和IChannelListener一样,他负责创建并管理通   道栈,一般会使用ClientBase类型来代替直接使用IChannelFactory接口,使用它的关键代码如下;

 

代码
1 ChannelFactory<IRequestChannel> factory=binding.buildChannelFactory<IRequestChannel> (new BindingParameterCollection());
2 IRequestChannel requestChannel=factory.createChannel(new EndpointAddress(http://localhost:9090/RequestReplyService));
3  requestChannel.open();
4  

        ICommunicationObject 接口和状态改变:通信有关的机制都会附带状态机, 其状态转换与分配网络资源,生成或接受连接,管理连接以及终止通信有关,ICommnicationObject实现定义状态机制的统一模型,所有的通道和管理器都实现了本接口。他的目的在于集中状态机的管理上,包括改变状态的方法,状态改变触发的时间以及当前状态的获取,一种由六种可用状态,分别为Opening,Created,Opened,Closing,Closed和Faulted,随着系统的运行状态会改变,

posted @ 2010-05-29 11:19  justlife  阅读(499)  评论(0编辑  收藏  举报