信道

信道是跨远程处理边界(无论是在应用程序域、进程还是计算机之间)在应用程序之间传输消息的对象。信道可以在终结点上侦听入站消息,向另一个终结点发送出站消息,或者两者都可以。这使您能够插入各种各样的协议,即使信道的另一端上没有公共语言运行库。

信道必须实现 IChannel 接口,该接口提供诸如 ChannelName 和 ChannelPriority 之类的信息性属性。专用于在特定端口上侦听特定协议的信道实现 IChannelReceiver,而专用于发送信息的信道实现IChannelSenderTcpChannel 和 HttpChannel 对象都实现这两种接口,因此它们可用于发送或接收信息。

您可以通过以下方式将信道注册到远程处理基础结构:

  • 如果您正在发布可远程处理的对象,请在注册服务器对象之前调用 ChannelServices.RegisterChannel

  • 如果您正在使用可远程处理的对象的功能,请在创建服务器对象的实例之前调用 RegisterChannel

信道还可以从远程处理配置文件加载。有关详细信息,请参见配置

在客户端,消息在经过客户端上下文链后传递到客户端信道接收链。第一个信道接收器通常是格式化程序接收器;它将消息序列化为流(然后该流将被沿着信道接收链传递到客户端传输接收器)。然后客户端传输接收器将此流写出到网络。

在服务器端,服务器传输接收器从网络读取请求,并将该请求流传递到服务器信道接收链。此链末端的服务器格式化程序接收器将该请求反序列化为消息。然后将此消息传递到远程处理基础结构。有关信道接收器的更多信息,请参见接收器和接收链

信道规则

当客户端调用远程对象上的方法时,参数以及其他与调用相关的详细信息将通过信道传输到远程对象。调用的任何结果均以相同的方式返回。客户端可以选择在服务器上注册的任何信道与远程对象通信,这样就使开发人员能够自由地选择最符合他们需要的信道。也可以自定义任何现有信道或者生成使用不同通信协议的新信道。信道选择需要遵循以下规则:

  • 在可以调用远程对象之前,服务器上的远程处理系统必须注册了至少一个信道。必须在注册对象之前注册信道。如果客户端上没有注册信道,则远程处理系统将选择或创建一个信道以发送出站调用。

    Note注意

    如果客户端需要回调函数,则必须在客户端上注册一个侦听信道,并且必须将服务器配置为使用兼容的信道。

  • 信道基于每个应用程序域进行注册。单个进程可以包含多个应用程序域。当进程结束时,它注册的所有信道都自动销毁。

  • 信道名称在应用程序域中必须是唯一的。例如,由于默认信道具有名称,因此,要在一个应用程序域中注册两个 HttpChannel 对象,就必须在注册它们之前更改信道的名称。下面的 C# 代码示例对此加以阐释。

    IDictionary prop = new Hashtable(); prop["name"] = "http1"; prop["port"] = "9001"; ChannelServices.RegisterChannel(new HttpChannel(prop, null, null));
  • 不能多次注册在特定端口上侦听的信道。即使信道是基于每个应用程序域注册的,同一台计算机上的不同应用程序域仍不能注册在同一个端口上侦听的相同信道。

  • 如果您不能确定是否有可用的端口,那么在配置信道的端口时请使用 0(零),远程处理系统将为您选择一个可用的端口。

  • 客户端可以使用任何已注册的信道与远程对象进行通信。当客户端尝试连接到远程对象时,远程处理系统将确保该远程对象被连接到正确的信道。客户端负责在尝试与远程对象通信之前调用ChannelServices.RegisterChannel。如果客户端需要回调函数,则必须注册信道和端口。

当客户端在代理上调用方法时,调用将被截获并捆绑为消息,然后被传递到 RealProxy 类的实例。RealProxy 类将消息转发到消息接收器以进行处理。消息接收器与由远程对象注册的信道建立连接,并通过该信道将消息调度到起始应用程序域中。在那里,该消息将被取消封送,并且将对远程对象本身进行调用。

当远程处理在客户端的域中初始化远程对象的代理时,将通过调用选定信道上的 IChannelSender.CreateMessageSink 从客户端配置的信道中检索一个能够与该远程对象通信的消息接收器。

远程处理系统的一个易引起混淆的方面是远程对象和信道之间的关系。例如,如果 WellKnownObjectMode.SingleCall 远程对象仅在调用到达时激活,该对象会如何侦听要连接的客户端。

这是可能的,部分原因在于远程对象共享信道;远程对象不拥有信道。承载远程对象的服务器应用程序必须注册它们所需要的信道以及它们要使用远程处理系统公开的对象。信道注册之后,将自动在指定的端口开始侦听客户端请求。对于同步调用的情况,将在消息调用期间维护来自客户端的连接。由于每个客户端连接都是在它自己的线程中处理的,因此单个信道可以同时服务于多个客户端。

请参见

原文地址:https://www.cnblogs.com/binlyzhuo/p/1753793.html