续订租约

租约一旦创建,该租约上唯一可以更改的属性为 ILease.CurrentLeaseTime。有两种续订租约的方式:客户端可以直接调用 ILease.Renew,或者可以联系主办方并要求它续订租约。

主办方

主办方侦听来自宿主应用程序域的有关主办方是否延长某个特定对象的生存期租约的查询。主办方实现 ISponsor,并通过获取对租约的引用然后调用 ILease.Register 来注册到租约管理器。通常,在对于每个远程对象都存在许多个客户端的情况下,与让所有客户端都向该远程对象发送请求相比,让该远程对象请求其中一个客户端进行租约续订更有效。

备注

从 .NET Framework 1.1 版开始,如果要注册主办方以参与服务器对象的生存期,则必须在服务器应用程序域和主办方这两方设置 Full 自动反序列化。有关详细信息,请参见 .NET 远程处理中的自动反序列化

使用主办方还在大量客户端之间提供了动态续订策略。这对于解决并行问题(一个或多个客户端可能向多个远程对象提出需要解决的问题)非常有效。当远程对象返回解决方案时,主办方将得到通知并允许所有其他远程对象的租约过期。

由于远程对象从它的当前位置与客户端联系而不需要客户端寻找它,因此,这种方法对迁移远程对象也很有用。

另外务必要注意,如果主办方位于较大的网络范围内或者位于设有很多防火墙的 Internet 上,则可能很难到达主办方。为避免这种情况,可以设置后备主办方,或者使主办方靠近宿主应用程序域,在这里抵达主办方有一定的把握。

宿主应用程序域的租约管理器维护一个主办方列表。当要求主办方续订租约的时间时,将请求列表顶部的主办方续订时间。如果主办方在 ILease.SponsorshipTimeout 时间范围内不响应,则会将其从列表中移除并调用列表中的下一个主办方。

使用主办方续订租约

主办方通过获取特定对象引用的租约,将其自身注册为主办方并等待远程租约管理器调用 ISponsor.Renewal 来参与生存期租约。对象租约是通过调用 RemotingServices.GetLifetimeService 获取的,同时将需要该租约的对象作为参数传递。此调用是 RemotingServices 类的一个静态方法。如果对象对于应用程序域是本地的,则此调用的参数是对该对象的本地引用,且返回的租约是对租约的本地引用。如果对象是远程的,则将代理作为参数传递。请注意,租约本身是引用封送 (MBR) 对象,因此获取远程对象的租约时将获取该租约的代理。因此,调用租约上的方法时,就是发出对服务器进程的远程调用。

如果已经创建了对象,就可以通过调用 Register 并传递主办方和可选的 TimeSpan 对象将主办方注册到远程租约管理器。

当该对象的租约已过期时,租约管理器可能回调到远程主办方。主办方对于它的 Renewal 实现的返回值则成为新的租约时间。

请参见

任务

如何:续订租约

参考

<lifetime> 元素
远程处理设置架构

概念

远程处理示例:生存期
生存期租约
初始化租约