用户代码不能直接创建通道,这些工作由特定的工厂对象完成。虽然这些工厂对象不是通道,但也被认为是通道层的一部分。在WCF的类型系统中,通道工厂有其特殊的名字,这些名称与发送者和接收者的命名不同。在接收端,这些类型被称为通道侦听器。在发送端,这些类型被称为通道工厂。当两者放在一起的时候,它们被称为通道管理器。
接收者:通道侦听器
通道侦听器就是用来创建通道并侦听传入的消息。通道侦听器处于堆栈的最底层。传输通道侦听器是唯一一个绑定地址并且开始侦听连接消息的通道。堆栈处于上面,通道侦听器会依次调用下一个通道侦听器的Accept方法,直到调用最底层的传输通道侦听器,如图7-1所示。
图7-1传输通道堆栈
IChannelListener接口
所有的通道都实现了System.ServicerModel.Channels.IChannelListener接口。这个接口会强制所有的通道实现通道状态机,并包含一些基本的通道侦听器成员。IChannelListener的定义如下:
public interface IChannelListener : ICommunicationObject
{
IAsyncResult BeginWaitForChannel(TimeSpan timeout, AsyncCallback callback, object state);
Boolean EndWaitForChannel(IAsyncResult result);
Boolean WaitForChannel(TimeSpan timeout);
T GetProperty<T>() where T:class;
//侦听地址
Uri Uri { get; }
}
IChannelListener<TChannel>接口
所有的通道同样也实现IChannelListener<TChannel>接口。这里会第一次看到伯克利Socket API的Accept范式,如下所示:
public interface IChannelListener<TChannel>:IChannelListener where TChannel : class, IChannel
{
TChannel AcceptChannel();
TChannel AcceptChannel(TimeSpan timeout);
IAsyncResult BeginAcceptChannel(AsyncCallback callback, object state);
IAsyncResult BeginAcceptChannel(IAsyncResult result);
}
所有的通道侦听器都继承自抽象类型System.ServicerModel.Channels.ChannelListenerBase。通道侦听器也继承自抽象类型System.ServiceModel.Channels.ChannelListenerBase<TChannel>。这个类型是ChannelListenerBase的子类型,而且实现了IChannelListener<TChannel>接口。
发送者:通道工厂
发送者使用通道工厂来创建通道。它们和通道侦听器的许多特性相似,不同的是它们驻留在发送者内部,而且不需要从连接上侦听消息。
IChannelFactory接口
所有的通道工厂都继承了IChannelFactory接口。这个接口实现了ICommunicationObject接口,因此,可以强制它的继承者实现通道状态机。当然还可以展示与通道和通道侦听器类似的一个查询机制。代码如下所示:
public interface IChannelFactory<TChannel> : IChannelFactory
{
TChannel CreateChannel(EndpointAddress to);
TChannel CreateChannel(EndpointAddress to, Uri via);
}
通道工厂间接继承了抽象类型ChannelFactoryBase。概念上,它的作用与通道侦听器中使用的ChannelListenerBase类型一样。换句话说,ChannelListenerBase类型也提供了一种自定义打开、关闭、发送和接收消息超时属性的方式。ChannelFactoryBase<TChannel>类型继承了ChannelFactoryBase类型,而且实现了IChannelFactory<TChannel>接口。它也是通道工厂类型的基类。更进一步说,这个类型维护和控制通道的创建状态。