客户端:通道工厂和通道

本主题介绍通道工厂和通道的创建。

通道工厂和通道

通道工厂负责创建通道。 由通道工厂创建的通道用于发送消息。 这些通道负责获取来自上一层的消息,对消息进行必要的处理,然后将消息发送到下一层。 下图演示此过程。

Client Factories and Channels
通道工厂创建通道。

通道工厂在关闭时负责关闭其创建的但尚未关闭的所有通道。 请注意,此处的模型是非对称的,原因是当通道侦听器关闭时,它仅停止接受新通道,而使现有通道保持打开状态以便继续接收消息。

WCF 为此过程提供基类帮助程序。 (有关本主题中讨论的通道帮助程序类的关系图,请参阅通道模型概述。)

以下讨论基于传输:UDP 示例。

创建通道工厂

UdpChannelFactory 派生自 ChannelFactoryBase。 该示例重写 GetProperty 以提供对消息编码器的消息版本的访问。 该示例还重写 OnClose 以在状态机转变时拆开 BufferManager 的实例。

UDP 输出通道

UdpOutputChannel 实现 IOutputChannel。 构造函数对自变量进行验证,并基于传入的 EndPoint 来构造目标 EndpointAddress 对象。

重写 OnOpen 将创建用于向此 EndPoint 发送消息的套接字。

this.socket = new Socket(  
this.remoteEndPoint.AddressFamily,
  SocketType.Dgram,
  ProtocolType.Udp
);  

通道可以正常关闭或非正常关闭。 如果通道正常关闭,则套接字也将关闭,并调用基类 OnClose 方法。 如果引发异常,则基础结构将调用 Abort 以确保清理该通道。

this.socket.Close();  
base.OnClose(timeout);  

实现 Send()BeginSend()/EndSend()。 这将分解为两个主要部分。 首先,将消息序列化为字节数组:

ArraySegment<byte> messageBuffer = EncodeMessage(message);  

然后,在网络上发送生成的数据:

this.socket.SendTo(  
  messageBuffer.Array,
  messageBuffer.Offset,
  messageBuffer.Count,
  SocketFlags.None,
  this.remoteEndPoint  
);  

另请参阅