客户端:通道工厂和通道
本主题介绍通道工厂和通道的创建。
通道工厂和通道
通道工厂负责创建通道。由通道工厂创建的通道用于发送消息。这些通道负责获取来自上一层的消息,对消息进行必要的处理,然后将消息发送到下一层。下图演示此过程。
通道工厂在关闭时负责关闭其创建的但尚未关闭的所有通道。请注意,此处的模型是非对称的,原因是当通道侦听器关闭时,它仅停止接受新通道,而使现有通道保持打开状态以便继续接收消息。
WCF 为上述过程提供基类帮助器。(有关本主题中所讨论的通道帮助器类的关系图,请参见通道模型概述。)
- CommunicationObject 类实现 ICommunicationObject 并强制执行开发通道的步骤 2 中所述的状态机。
CreateChannel
重载合并到一个OnCreateChannel
抽象方法中。
下面的讨论基于Transport: UDP 示例。
创建通道工厂
``UdpChannelFactory
派生自 ChannelFactoryBase。该示例重写 GetProperty 来提供对消息编码器的消息版本的访问。该示例还重写 OnClose 以在状态机转变时拆开 BufferManager 的实例。
UDP 输出通道
``UdpOutputChannel
实现 IOutputChannel。构造函数对参数进行验证并构造基于传入的 EndpointAddress 的目标 EndPoint 对象。
重写 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
);