.NET Framework 远程处理结构
.NET 远程处理基础结构是进程间通信的抽象方法。系统的大部分在运行时无须关心。例如,可以通过值传递或可以复制的对象是自动在不同应用程序域中或不同计算机上的应用程序之间传递的。只需将自定义类标记为可序列化便可使它工作。
然而,远程处理系统的真正优点在于它具有的通信功能,它能够使位于不同应用程序域中的对象相互通信,还能够使位于不同进程中的对象相互通信,即使这些进程使用的传输协议、序列化格式、对象生存期方案和对象创建模式不同,也是如此。此外,远程处理使您可以出于任何原因在通信进程的几乎任何阶段进行干预。
无论您已经实现了一些分布式应用程序,还是只对将组件移动到其他计算机上以增加程序的可伸缩性感兴趣,您都可以非常容易地将远程处理系统理解为一般性的进程间通信系统,它具有一些能够轻松处理大多数方案的默认实现。下面的讨论从使用远程处理进行进程间通信的基础知识开始。
副本与引用
进程间通信需要具备以下条件:存在向进程外的调用方提供功能的服务器对象,存在对服务器对象进行调用的客户端,并具有一个将调用从一端运送到另一端的传输机制。服务器方法的地址是逻辑地址,并且可在一个进程中正常工作,但不能在其他客户端进程中正常工作。要解决此问题,客户端可以通过创建对象的完整副本,然后将该副本移动到客户端进程来调用服务器对象,这样在该客户端进程中就可以直接调用该副本的方法了。
然而,许多对象无法或不应复制和移动到某个其他进程来执行。具有许多方法的非常大的对象不适合复制到或通过值传递到其他进程。通常,客户端仅需要由服务器对象上的一个或几个方法返回的信息。复制整个服务器对象将是对带宽以及客户端内存和处理时间的浪费,因为这种复制将复制可能与客户端需求无关的大量内部信息或可执行结构。另外,许多对象公开公共功能,但是需要用于内部执行的私有数据。复制这些对象会使未经授权的客户端能够查看内部数据,从而造成安全隐患。最后,某些对象使用的数据无法以任何可理解的方式复制。例如,FileInfo 对象包含一个对操作系统文件的引用,此文件在服务器进程的内存中具有唯一的地址。可以复制这个地址,但它在另一进程中将永远不会具有任何意义。
在这些情况下,服务器进程应当向客户端进程传递一个对服务器对象的引用,而不是传递该对象的副本。客户端可以使用此引用来调用服务器对象。这些调用不在客户端进程中执行。相反,远程处理系统收集关于调用的所有信息并将其发送到服务器进程,在该进程中,将解释这些信息并查找正确的服务器对象,然后代表客户端对象向该服务器对象发出调用。然后,调用的结果被发送回客户端进程以返回到客户端。带宽仅用于关键的信息:调用、调用参数以及任何返回值或异常。
简化的远程处理结构
使用对象引用在服务器对象和客户端之间进行通信是远程处理的核心。但是,远程处理结构为程序员提供了更为简单的过程。如果正确配置了客户端,只需要使用 new(或托管编程语言中的实例创建函数)创建远程对象的新实例。客户端接收对服务器对象的引用,然后就可以像该对象位于您的进程中而不是运行在另外一台计算机上一样调用其方法。远程处理系统使用代理对象来产生服务器对象位于客户端进程中的效果。代理是将它们自身显示为某个其他对象的临时代理对象。当客户端创建远程类型的实例时,远程处理基础结构将创建对于客户端来说与远程类型完全相同的代理对象。客户端调用此代理上的方法,而远程处理系统则接收调用,将其路由到服务器进程,调用服务器对象,并将返回值返回到客户端代理,而客户端代理将结果返回到客户端。
远程调用必须以某种方式在客户端和服务器进程之间传送。如果要自己生成远程处理系统,可以从学习网络编程、各种各样的协议和序列化格式规范开始。在 .NET 远程处理系统中,打开网络连接和使用特定协议将字节发送到接收应用程序所需的基础技术的组合被表示为传输信道。
信道是一个承载数据流、根据特定网络协议创建包并将该包发送到另一台计算机的类型。某些信道只能接收信息,另外一些信道只能发送信息,还有一些信道(例如默认的 TcpChannel 和 HttpChannel 类)则既可以发送、又可以接收。
虽然服务器进程了解有关每个唯一类型的一切信息,但是客户端仅知道它需要对其他应用程序域(可能在其他计算机上)中的某个对象的引用。从服务器应用程序域之外的世界中,URL 可定位该对象。向外部世界表示唯一类型的 URL 是激活 URL,它们确保远程调用是针对正确类型发出的。有关更多详细信息,请参见激活 URL。
完整的远程处理系统设计
假定您的应用程序在一台计算机上运行,而您想使用由存储在另一台计算机上的类型公开的功能。下图显示常规的远程处理过程。
远程处理过程
如果关系两端均正确配置,则客户端仅创建一个服务器类的新实例。远程处理系统创建一个表示该类的代理对象,并向客户端对象返回一个对该代理的引用。当客户端调用方法时,远程处理基础结构将处理调用,检查类型信息,并通过信道将该调用发送到服务器进程。侦听信道获得该请求并将其转发给服务器远程处理系统,服务器远程处理系统查找(或在必要时创建)并调用被请求的对象。然后,此过程将反向进行,服务器远程处理系统将响应捆绑成消息并由服务器信道发送到客户端信道。最后,客户端远程处理系统通过代理将调用的结果返回给客户端对象。
为使此过程工作只需要非常少的实际代码,但应当认真考虑关系的设计和配置。即使代码完全正确,仍然可能因为 URL 或端口号不正确而失败。有关更多信息,请参见配置。
虽然远程处理进程的这种高级别概述相当简单,但低级别的详细信息可能是非常复杂的。其他主题中提供了对远程处理的主要元素更为深入的讨论,如下面所列出的主题所示。
请参见
概念
边界:进程和应用程序域
可远程处理的和不可远程处理的对象
信道
远程处理中的安全性
远程应用程序的配置