.NET Remoting 为管理远程对象的生存期提供了功能强大的机制。如果我们的服务器对象不保留任何状态(如 SingleCall 对象),那么不必关注此进程,只需让 Remoting 基础结构完成要完成的工作即可,需要时,对象将作为垃圾被回收。如果我们保留状态,无论是服务器激活的 Singleton 还是客户端激活的对象,我们可能都要参与生存期管理进程:对象租用。我们已经看到很小程度的参与,使用了一种简单(且有用)的方法,就是忽略 InitializeLifetimeService 方法,如以上对 Singleton 的介绍中所述。这就使我们能够在集成对象的进程运行期间始终保留对象。那么,这个对象生存期进程如何工作呢?
Remoting 提供的对象管理机制基于租用原则:您永远不会拥有一个对象,只是借用它,只要持续支付就可以一直使用它。此过程将在下文中进一步介绍。但是,首先要简单介绍一下在 COM 领域中是如何处理对象清理的。DCOM 综合使用 ping 和引用计数两种方法来确定对象是否仍在运行,这样做不仅容易出错,而且对网络带宽的要求很高。使用引用计数时,最坏的情况是从来不会被完全理解,最好的情况也是很脆弱。过去(现在仍是)要对引用计数应用一些简单的规则才能使其发挥作用。COM 对象的 IUnknown 接口包括了 AddRef 和 Release 方法,需要由开发人员在适当的时候调用。有时程序员弄错了,结果造成对象没被删除,还导致相关的内存泄露。
相反,Remoting 基于租用的生存期管理系统综合利用了租用、负责人和租用管理器。每个应用程序域都包含一个租用管理器,它将每个 Singleton 或客户端激活的对象的租用对象引用保存在其域中。每个租用可以有零个或多个相关的负责人,负责人能够在租用管理器确定租用过期时重新租用。这种租用功能是由 Remoting 基础结构通过 ILease 接口提供的,通过调用 InitializeLifetimeService 获得,如上文所述。ILease 接口定义了很多用于管理对象生存期的属性:
1、InitialLeaseTime。确定租用最初的有效期。
2、RenewOnCallTime。在每个方法调用后,更新此时间单元的租用。
3、SponsorshipTimeout。负责人通知租用过期后,Remoting 要等待的时间。
4、CurrentLeaseTime。距租用到期的时间(只读)。
租用过期后,租用管理器将通知所有租用负责人,询问他们是否要更新租用。如果不更新,将释放相关的对象引用。
负责人是可以为远程对象更新租用的对象。要成为负责人,您的类必须从 MarshalByRefObject 中导出并实现 ISponsor 接口。一个租用可以有多个负责人,一个负责人也可以参与多个租用。
但值得注意的是,这种功能强大的机制只是对管理有状态的远程对象的生存期有意义。如上所述,您或者完全忽略它,利用它在其进程容器运行时将对象保存在内存中,或者完全参与到租用机制中。
远程服务器集成
有很多方法可以集成 .NET 远程服务器,主要分为两大类,如下所述。
ASP.NET下的IIS集成
在 IIS 下集成远程服务器端对象的能力是作为标准功能提供的。它有很多优势,包括支持安全性和可伸缩性。
要在 IIS 下集成对象:
1、开发远程类并从 MarshalByRefObject 中继承(或将类声明为可序列化)。
2、使用 IIS 管理器创建一个虚拟的 Web 应用程序。
3、将包含您的类的程序集放到虚拟 Web 应用程序的 bin 子文件夹中。
4、创建一个 web.config 文件以保存 Remoting 服务器的配置定义,并将它放置到 Web 应用程序的虚拟根目录中。
就这么简单。但是,您应该了解一些限制:
1、不能为 IIS 集成指定应用程序名称,因为它是虚拟应用程序名称。
2、必须使用 HHTP 通道。
3、如果 Remoting 客户端也是一个 Web 应用程序,则启动时必须调用 RemotingConfiguration.Configure,它通常在 Global.asax 文件的 Application_Start 方法中。不能使用 <client> 标记来自动配置客户端 Web 应用程序。
4、不要指定端口,因为 IIS 会进行端口分配。如果需要,您仍可以使用 IIS 管理来为虚拟应用程序指定端口。
5、Remoting 应用程序域将集成在 Aspnet_wp.exe 辅助进程中,默认情况下,它将采用该进程的标识。
注意:目前 ASP.NET 中有一个错误,要求将 Aspnet_wp.exe 辅助进程的进程标识设置为“system”或本地计算机帐户,默认设置中,machine.config 中的“machine”配置不正确,导致在域控制器的 IIS 下集成时,ASP.NET 应用程序出现错误 500“内部服务器错误”。可以论证的是,该错误是由于缺乏说明如何适当地配置计算机帐户的文档所造成的。
在 IIS 下集成有很多功能上的优势:默认情况下,可以提供伸缩性、线程、审核、身份验证、授权和安全通信等功能。ASP.NET 辅助进程一直在运行,并且可以使用 machine.config 中的 <processModel> 元素进行线程和错误管理方面的微调。简而言之,IIS 的优势和功能都可用于远程服务器。
但它也有一些缺点:您必须使用比 TCP 速度慢的 HTTP。另外,IIS 可能循环执行 ASP.NET 辅助进程,这将破坏所有 Singleton 的状态。对您来说,这可能是问题也可能不是问题,要取决于您的设计需要,因为客户端的下一个调用将重新启动 Singleton。您可以将 IIS 配置为不循环执行辅助进程,但这种能力很有限,特别是在 IIS 5 中,而且可能造成更进一步的影响。这里最根本的意思是,如果要求远程服务器的安全性,那么无疑要使用 IIS 集成。至于性能,只有在系统测试/使用过程中实际察觉到问题时,才需要考虑,而且总能在硬件上找到解决问题的办法。
本U R L:http://www.qqread.com/dotnet/y520949000.html相关专题
- .NET移动与嵌入式技术 (5950篇文章)
- .NET开发手册 (5652篇文章)
- vb.net入门——ToolBar 控件的使用 (267次浏览)
- vb.net入门——OpenFileDialog 组件的使用 (75次浏览)
- vb.net入门——FontDialog 组件的使用 (52次浏览)
- vb.net用Graphics画一个五角星 (46次浏览)
- vb.net入门——FolderBrowserDialog 组件的使 (45次浏览)
- vb.net绘制干扰点 (44次浏览)
- vb.net入门——ColorDialog 组件的使用 (41次浏览)
- vb.net巧用ToolTip控件获取鼠标坐标 (39次浏览)
- 用vb.net创建一个鼠标绘图程序 (39次浏览)
- vb.net入门——SaveFileDialog 组件的使用 (38次浏览)



