在企业级应用开发中,分布式开发占据了越来越重要的位置。.NET Remoting 是一种可扩展性很强的开发技术。
.NET Remoting 类位于 System.Runtime.Remoting 名称空间及其子名称空间中,其中许多类在核 心程序集 mscorlib 中,一些只用于跨网络通信的类可用于 System.Runtime.Remoting 程序集中。
使用.NET Remoting 的原因
.NET Remoting 是在不同应用程序域之间通信的技术。使用.NET Remoting 在不同应用程序域之 间通信可以在同一个进程中、一个系统的进程之间或不同系统的进程之间进行。 对于客户端和服务器应用程序之间的通信,可以使用几种不同的技术。可以使用套接字编写应用 程序,或使用 System.Net 名称空间中的一些辅助类,便于处理协议、IP 地址和端口号(详见第 24 章)。 使用这种技术总是必须通过网络发送数据。所发送的数据可以是自己的自定义协议,其中由服务器解 释数据包,这样服务器就知道应调用什么方法。我们不仅需要处理发送的数据,还需要自己创建线程。
使用 ASP.NET Web 服务,可以跨网络传递消息。通过 ASP.NET Web 服务,可以获得平台独立 性。ASP.NET Web 服务不仅具有平台独立性,在客户端和服务器之间的耦合也比较松散,于是更容 易处理版本问题。.NET Remoting 总是在客户端和服务器之间提供较紧密的耦合,因为它们共享相同的对象类 型。.NET Remoting 给CLR 对象提供了跨不同应用程序域调用方法的功能。 .NET Remoting 的功能可以用应用程序类型和所支持的协议描述,还可以通过 CLR Object Remoting 来描述。 CLR Object Remoting 是.NET Remoting 的一个重要方面。所有的语言结构(如构造函数、委托、接 口、方法、属性和字段等)都可以与远程对象一起使用。.NET Remoting 跨网络扩展 CLR 对象的功能, CLR Object Remoting 可以处理激活、分布式标识、生命周期和调用上下文等方面的工作。它与 XML Web 服务大不相同。在 XML Web 服务中,对象是抽象的,客户端不需要知道服务器的对象类型。 目前,网络通信的佳选择是WCF。WCF 提供 ASP.NET Web 服务的功能,如 平台无关性,以及.NET Remoting 为.NET 与.NET 通信提供的性能和灵活性。.NET Remoting 仍具备 优势的一个地方是进程内部的应用程序域之间的通信。MAF 技术(System.AddIn)在 后台使用.NET Remoting。当然还有许多基于.NET Remoting 的现有.NET 解决方案,所以不能把.NET Remoting 重写为一门新技术。
.NET Remoting 是一个极为灵活的体系结构,它可以用于通过任意方式传输的任意应用程序中, 方法是使用任意的有效负载编码(payload endcoding)。 组合使用 SOAP 和 HTTP 只是调用远程对象的一种方式。传输信道是“可插入的”,也可以替 换。在.NET 4 中,可以获取 HttpChannel 类、TcpChannel 类和 IpcChannel 类分别表示的 HTTP 信道、 TCP 信道和 IPC 信道,还可以构建传输信道,以使用 UDP、IPX、SMTP、共享的内存机制或消息 队列,至于选择使用哪一个,自己完全有权决定。
有效负载可以用于传输方法调用的参数,这个有效负载编码也可以替换。Microsoft 发布了 SOAP 和二进制编码机制。可以通过 HTTP 信道来使用 SOAP 格式化程序,也可以通过二进制格式化程序 使用 HTTP。当然,这两种格式化程序都可以与 TCP 信道一起使用。
通过.NET Remoting,不但可以在每一个.NET 应用程序中使用服务器功能,还可以在任何地方 使用.NET Remoting,包括控制台应用程序、Windows 应用程序、Windows 服务或 COM 组件。.NET Remoting 还是用于对等通信的一种好技术。
.NET Remoting 术语详解
.NET Remoting 可以用于访问另一个应用程序域中的对象。不论两个对象是处于一个进程中, 还是处于不同的进程中,甚至处于不同的系统中,都可以使用.NET Remoting。
远程程序集可以配置为在应用程序域本地工作,或者配置为远程应用程序的一部分。如果程序 集是远程应用程序的一部分,则客户端收到一个代理而不是真实的对象进行会话。代理表示客户端 进程中的远程对象,由客户端应用程序用于调用方法。当客户端在代理中调用方法时,代理把一条 消息发送到信道中,该消息再传递给远程对象。
.NET 应用程序通常在应用程序域中工作。应用程序域可以看作进程中的子进程。传统上,进程 通常用作隔离的边界。在一个进程中运行的应用程序不能访问和销毁另一个进程中的内存。对于相 互通信的应用程序,需要跨进程的通信。利用.NET,应用程序域就成为进程中新的安全边界,原因 是MSIL 代码是类型安全和可验证的。不同应用程序可以在同一进程内的不同应用 程序域中运行。在同一应用程序域中的对象可以直接进行交互,但是在访问不同应用程序域中的对 象时,必须使用代理。
下面列出了.NET Remoting 体系结构的主要元素:
● 远程对象——远程对象是运行在服务器上的对象。客户端不能直接调用远程对象上的方法, 而要使用代理。使用.NET,很容易把远程对象和本地对象区分开:即任何派生自 MarshalByRefObject 的类从来都不会离开它的应用程序域。客户端可以通过代理调用远程对 象的方法。
● 信道——信道用于客户端和服务器之间的通信。信道包括客户端的信道部分和服务器的信 道部分。.NET Framework 4 提供了 3 种信道类型,它们分别通过 TCP、HTTP 和IPC 进行 通信。此外,还可以创建自定义信道,这些信道使用其他协议通信。
● 消息——消息被发送到信道中。消息是为客户端和服务器之间的通信而创建的。消息包含 远程对象的信息、被调用方法的名称以及所有的参数。
● 格式化程序——格式化程序用于定义消息如何传输到信道中。.NET 4 有SOAP 格式化程序 和二进制格式化程序。使用 SOAP 格式化程序可以与不是基于.NET Framework 的Web 服务 通信。二进制格式化程序速度更快,可以有效地用在内部网环境中。当然,也可以创建自 定义格式化程序。
● 格式化程序提供程序——格式化程序提供程序用于把格式化程序与信道关联起来。通过创 建信道,可以指定要使用的格式化程序提供程序,格式化程序提供程序则定义把数据传输 到信道中时所使用的格式化程序。
● 代理——客户端调用代理的方法,而不是远程对象的方法。代理分为两种:透明的代理和 真实的代理。对于客户端,透明代理看起来与远程对象类似。在透明代理上,客户端可以调用远程对象实现的方法。然后,透明代理调用真实代理上的 Invoke()方法。Invoke()方法使 用消息接收器把消息传递给信道。
● 消息接收器——消息接收器是一个侦听器(interceptor)对象,简称接收器。在客户端和服务器 上都有侦听器。接收器与信道相关联。真实的代理使用消息接收器把消息传递到信道中,因 此,在消息进入信道之前,接收器可以进行截获工作。根据接收器所处的位置,可以把接收 器称为特使接收器(envoy sink)、服务器上下文接收器、对象上下文接收器等。
● 激活器——客户端可以使用激活器在服务器上创建远程对象,或者获取一个被服务器激活 的对象的代理。
● RemotingConfiguration 类——该类是用于配置远程服务器和客户端的一个实用程序类。它 可以用于读取配置文件或动态地配置远程对象。
● ChannelServices 类——该类是一个实用程序类,可用于注册信道并把消息分配到信道中。