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