本主题介绍通道工厂和通道的创建。
通道工厂和通道
通道工厂负责创建通道。 通道工厂创建的通道用于发送消息。 这些通道负责从上面的层获取消息,执行所需的任何处理,然后将消息发送到下面的层。 下图演示了此过程。
通道工厂创建通道。
通道工厂在关闭时负责关闭其创建的但尚未关闭的所有通道。 请注意,此模型不对称,因为当通道侦听器关闭时,它只会停止接受新通道,但让现有通道保持打开状态,以便它们能够继续接收消息。
WCF 为此过程提供基类帮助程序。 (有关本主题中讨论的通道辅助类的示意图,请参阅 通道模型概述。)
该 CommunicationObject 类实现 ICommunicationObject 并强制实施 开发通道步骤 2 中所述的状态机。
该 ChannelManagerBase 类实现 CommunicationObject 并提供一个统一的基类,用于 System.ServiceModel.Channels.ChannelFactoryBase 和 System.ServiceModel.Channels.ChannelListenerBase。 该 ChannelManagerBase 类与 ChannelBase实现的基类 IChannel结合使用。
该ChannelFactoryBase类实现ChannelManagerBase和IChannelFactory,并将
CreateChannel
重载合并为一个OnCreateChannel
抽象方法。类 ChannelListenerBase 实现 IChannelListener。 它负责执行基本状态管理。
以下讨论基于 传输: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
);