信道

本主题介绍一项传统技术,保留该技术是为了向后兼容现有的应用程序,不建议对新的开发使用该技术。现在应该使用  Windows Communication Foundation (WCF) 来开发分布式应用程序。

信道是跨越远程处理边界(无论是在应用程序域、进程还是计算机之间)在应用程序之间传递消息的对象。信道可以在终结点侦听入站消息,向其他终结点发送出站消息,或者进行这两种操作。这使您可以插入范围广泛的协议(即使公共语言运行库不在该信道的另一端)。

信道必须实现 IChannel 接口,该接口提供信息性的属性,例如 ChannelNameChannelPriority。旨在侦听特定端口上的特定协议的信道实现 IChannelReceiver,而旨在发送信息的信道实现 IChannelSenderTcpChannelHttpChannel 对象都实现这两种接口,因此它们可用于发送或接收信息。

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

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

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

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

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

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

信道规则

当客户端对远程对象调用方法时,参数和其他与该调用相关的详细信息都通过信道传输到远程对象。调用的所有结果也是以同样的方式返回。客户端可以选择在服务器上注册的任意信道来与远程对象通信,从而使开发人员可以自由地选择最能满足他们的需要的信道。还可以自定义任意现有信道,或者生成使用其他通信协议的新信道。信道的选择遵循以下规则:

  • 至少有一个信道必须已经向服务器上的远程处理系统注册,然后才能调用远程对象。必须先注册信道,然后再注册对象。如果没有在客户端上注册信道,远程处理系统便会选择或创建一个信道来发送出站调用。

    dkfd3wha.note(zh-cn,VS.100).gif注意:
    如果客户端期望回调函数,则必须在客户端上注册侦听信道,并且必须将服务器配置为使用兼容的信道。

  • 信道是针对每个应用程序域注册的。一个进程可以包含多个应用程序域。一个进程结束时,它所注册的所有信道都将自动销毁。

  • 在应用程序域内,信道名称必须是唯一的。例如,由于默认信道有名称,若要在一个应用程序域中注册两个 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 远程对象仅当有调用时才被激活,那么该对象如何侦听要连接的客户端。

可能的部分原因是,远程对象共享信道而不拥有信道。承载远程对象的服务器应用程序必须注册它们需要的信道以及向远程处理系统公开的对象。信道经过注册后,会自动开始在指定的端口上侦听客户端请求。在发生同步调用时,来自客户端的连接在消息调用的持续时间内将保留。由于每个客户端连接都是在它自己的线程内处理的,因此一个信道可以同时为多个客户端服务。

另请参见

参考

HttpChannel
TcpChannel

概念

选择信道
序列化格式化程序
接收器和接收器链

其他资源

.NET Framework 远程处理概述