只有图2中的这些接口,才属于WCF的通道模型,在WCF中一样提供了一些基类如CommunicationObject、ChannelFactoryBase等,在实现自定义的通道通讯对象时,也能够直接继承于这些基类,但要注意,这些基类仅仅是为实现自定义通道通讯对象提供了方便,它们自己并不属于通道模型的一部分。
ICommunicationObject接口为WCF中全部面向通讯的对象提供了契约,除了通道、通道侦听器、通道工厂外,还有调度程序和服务主机,定义了基本状态的协定。它包括一组用于启动状态转换的打开、关闭和停止方法,打开和关闭方法的异步版本,一组提供状态转换通知的事件和一个个用于检查对象状态的公开State属性,它的定义以下所示:
public interface ICommunicationObject
{
// 状态属性
CommunicationState State { get; }
// 事件
event EventHandler Closed;
event EventHandler Closing;
event EventHandler Faulted;
event EventHandler Opened;
event EventHandler Opening;
// 方法
void Abort();
void Close();
void Close(TimeSpan timeout);
void Open();
void Open(TimeSpan timeout);
// 异步方法
IAsyncResult BeginClose(AsyncCallback callback, object state);
IAsyncResult BeginClose(TimeSpan timeout, AsyncCallback callback, object state);
IAsyncResult BeginOpen(AsyncCallback callback, object state);
IAsyncResult BeginOpen(TimeSpan timeout, AsyncCallback callback, object state);
void EndClose(IAsyncResult result);
void EndOpen(IAsyncResult result);
}
ICommunicationObject 的初始状态是“已建立”,此时能够配置它的各类属性。 一旦处于“已打开”状态,对象就可用于发送和接收消息,但它的属性将视为不可变。 一旦处在“正在关闭”状态,对象就不能再处理新的发送或接收请求,但在到达“关闭”超时前有可能完成现有的请求。 若是发生不可恢复的错误,则对象将转换到“出错”状态,此时能够检查该对象以获取有关错误的信息,该对象最终将关闭。 处于“已关闭”状态时,该对象实质上已到达状态机的终点。 对象一旦从一个状态转换到下一个状态,它将不会返回至前一状态,整个过程图3所示:
图 3
通道形状
每一个通道均实现一个或多个接口,称为通道形状接口或通道形状。通道形状的最底层是 IChannel 接口,该接口提供一个 GetProperty<T> 方法,用做访问由通道堆栈中的通道公开的任意功能的分层机制。扩展 IChannel 的五种通道形状为:
1.IInputChannel:用于接收消息
2.IOutputChannel:用于发送消息
3.IRequestChannel:用于发送请求
4.IReplyChannel:用于发送回复
5.IDuplexChannel:用于双向消息传递
它们之间的关系如图4所示:
图 4
其实能够看出,IDuplexChannel接口是IInputChannel和IOutputChannel接口的联合,全部的通道形状都同时扩展了ICommunicationObject和IChannel。这5种通道模型分别对应于不一样的消息交换模式,在使用数据报模式时,消息发送方通道实现了IOutputChannel接口,而消息接收方通道实现了IInputChannel接口;在请求响应模式中,客户端通道实现IRequestChannel接口,而服务通道实现IReplyChannel接口;在双工通讯模式中,因为双方都能发送和接收消息,客户端和服务通道实现了IDuplexChannel接口,如图5所示:
图 5
服务端通道
在通道对象模型中,除了IChannel接口,另一个接口IChannelListener用于消息的接收端,经过绑定来生成通道侦听器(在绑定中有关于协议、编码和传输的信息,关于绑定能够参考
WCF专题系列(6):消息如何传递之绑定Part 1),用于侦听传入的消息。通道侦听器负责建立通道并从下面的层或者从网络接收消息,收到的消息将借助于通道侦听器所建立的通道传送到上面的层中。整个过程如图6所示:
图 6
在WCF的内部,对于消息的每个处理(即通道堆栈中的通道),都会对应一个内部的通道侦听器,如针对事务处理的TransactionChannelListener和使用TCP传输的TcpChannelListener,分别用于建立各自对应的通道。
客户端通道
在WCF的客户端,通道的建立使用通道工厂,建立的这些通道负责获取来自上一层的消息,对消息进行必要的处理,而后将消息发送到下一层,如图7所示:
图 7
在WCF内部,一样对于消息的每个处理,都会有相应的通道工厂,如使用TCP传输的TcpChannelFactory,用于建立对应的通道。
总结
本文详细介绍了WCF中的通道编程模型以及关于通道、通道监听器和通道工厂等,大多数都是纯理论的知识,在下一篇文章中,将会经过一个示例来加深对于本文所讲知识的认识。
©著做权归做者全部:来自51CTO博客做者lihuijun的原创做品,如需转载,请注明出处,不然将追究法律责任
扫一扫,领取大礼包git
Ctrl+Enter 发布html
发布java
取消jquery