通道对象有三类:通道、通道侦听器和通道工厂。 通道是应用程序和通道堆栈之间的接口。 通道侦听器负责在接收(或侦听)端创建通道,通常是为了响应新的传入消息或连接。 通道工厂负责在发送端创建通道,以启动与终结点的通信。
通道侦听器和通道
通道侦听器负责创建通道并从下面的层或网络接收消息。 收到的消息使用通道侦听器创建的通道传递到上面的层。
下图说明了接收消息并将其传送到上述层的过程。

通道侦听器接收消息并借助于通道将收到的消息传送到上面的层。
该过程在概念上可以建模为每个通道内的队列,尽管实现实际上可能不使用队列。 通道侦听器负责从下面的层或网络接收消息并将其放入队列中。 该通道负责从队列获取消息,并在该层请求消息时将它们交给上面的层,例如通过调用 Receive 通道。
WCF 为此过程提供基类帮助程序。 有关本文中讨论的通道辅助类的关系图,请参阅 通道模型概述。
该 CommunicationObject 类实现 ICommunicationObject 并强制实施 开发通道步骤 2 中所述的状态机。
该 ChannelManagerBase 类实现 CommunicationObject 并提供一个统一的基类,用于 ChannelFactoryBase 和 ChannelListenerBase。 该 ChannelManagerBase 类与 ChannelBase实现的基类 IChannel结合使用。
该ChannelFactoryBase类实现ChannelManagerBase和IChannelFactory,并将
CreateChannel重载合并为一个OnCreateChannel抽象方法。类 ChannelListenerBase 实现 IChannelListener。 它负责执行基本状态管理。
以下讨论基于 传输:UDP 示例。
创建通道侦听器
该示例实现的UdpChannelListener派生自ChannelListenerBase类。 它使用单个 UDP 套接字来接收数据报。 OnOpen 方法在异步循环中使用 UDP 套接字接收数据。 然后使用消息编码系统将数据转换为消息:
message = UdpConstants.MessageEncoder.ReadMessage(
new ArraySegment<byte>(buffer, 0, count),
bufferManager
);
由于可以用同一个数据报通道来表示来自多个源的消息,因此 UdpChannelListener 是一个单一实例侦听器。 一次最多只能将一个活动 IChannel 与此侦听器相关联。 仅当由AcceptChannel方法返回的通道随后被销毁时,此示例才会生成另一个通道。 收到的消息将排入此单一实例通道的队列中。
Udp输入通道
类 UdpInputChannel 实现 IInputChannel。 该类包括一个传入消息队列,该队列由 UdpChannelListener 的套接字来填充。 这些消息可以由 Receive 方法取消排队。