技术开发 频道

WSE 3.0 TCP 互操作性


【IT168技术文档】

  WSE 3.0 TCP 互操作性传输示例演示如何将 TCP 双工会话作为自定义 Windows Communication Foundation (WCF) 传输实现, 还演示如何通过网络,使用通道层的扩展性与已经过部署的现有系统进行交互。下列步骤演示如何生成此自定义 WCF 传输:

  1. 从 TCP 套接字开始,创建 IDuplexSessionChannel 的客户端和服务器实现以使用 DIME 组帧来描述消息边界。
  2. 创建一个连接到 WSE TCP 服务并通过客户端 IDuplexSessionChannel 发送组帧消息的通道工厂。
  3. 创建一个通道侦听器以接受传入的 TCP 连接并生成相应的通道。
  4. 请确保将特定于网络的任何异常正常化为 CommunicationException 的相应派生类。
  5.添加一个用来向通道堆栈中添加自定义传输的绑定元素。 有关更多信息,请参见Adding a Binding Element。

  创建 IDuplexSessionChannel

  编写 WSE 3.0 TCP 互操作性传输的第一步是在 Socket 的顶部创建 IDuplexSessionChannel 的实现。 WseTcpDuplexSessionChannel 派生自 ChannelBase。 消息的发送逻辑主要由以下两个部分组成:(1) 将消息编码为字节;(2) 对这些字节进行组帧并通过网络发送它们。

  ArraySegment<byte> encodedBytes = EncodeMessage(message);

  WriteData(encodedBytes);

  另外,我们设置了一个锁,以保证在调用 Send() 时可以按顺序保留 IDuplexSessionChannel,以便对基础套接字的调用能够正确地同步。

  WseTcpDuplexSessionChannel 使用 MessageEncoder 在 Message 和 byte[] 之间相互转换。 由于  WseTcpDuplexSessionChannel 为传输,因此它还负责应用在配置通道时所使用的远程地址。EncodeMessage 封装该转换的逻辑:

  this.RemoteAddress.ApplyTo(message);

  return encoder.WriteMessage(message, maxBufferSize, bufferManager);

  一旦将 Message 编码为字节,就必须通过网络传输它。 这要求系统定义消息边界。 WSE 3.0 使用某个版本的 DIME(可能为英文网页)作为其组帧协议。WriteData 封装用来将 byte[] 包装到一组 DIME 记录中的组帧逻辑。

  用来接收消息的逻辑与组帧逻辑非常相似。 其复杂性主要在于,处理读取套接字时所返回的字节数比已请求的更少这一情况。 若要接收消息,WseTcpDuplexSessionChannel 读取网络中的字节,对 DIME 组帧进行解码,然后使用 MessageEncoder 将 byte[] 转换为 Message。

  基 WseTcpDuplexSessionChannel 假设它接收连接的套接字。 这个基类处理套接字的关闭。 可通过三个位置与套接字关闭进行交互:

  1.OnAbort - 以非正常方式关闭套接字(硬关闭)。
  2.On[Begin]Close - 正常关闭套接字(软关闭)。
  3.session.CloseOutputSession - 关闭出站数据流(半关闭)。

  通道工厂

  编写 TCP 传输的下一步是为客户端通道创建 IChannelFactory 的实现。

  WseTcpChannelFactory 派生自 ChannelFactoryBase<IDuplexSessionChannel>。 它是一个用来重写 OnCreateChannel 以生成客户端通道的工厂:
protected override IDuplexSessionChannel OnCreateChannel(EndpointAddress remoteAddress, Uri via) { return new ClientWseTcpDuplexSessionChannel(encoderFactory, bufferManager, remoteAddress, via, this); }
0
相关文章