存留期租用期

本主題專門說明一項為了在現有應用程式中提供回溯相容性而保留的舊有技術,不建議用於新的開發工作。分散式應用程式應使用  Windows Communication Foundation (WCF) 進行開發。

傳址封送處理物件 (MBR) 不會永遠駐留在記憶體中,不管是伺服器啟動的 Singleton 物件,或是用戶端啟動物件都是一樣。相反地,除非型別覆寫 MarshalByRefObject.InitializeLifetimeService 來控制本身的存留期原則,否則每個 MBR 的存留期都是由租約期限、租用管理員,以及一些贊助者所控制。在此情況下,MBR 物件的租用期就是物件保留在記憶體中的總時數。租用期就是在 .NET Framework 遠端處理系統開始刪除特定物件並回收記憶體程序之前,該物件在記憶體中維持作用中狀態的期間。伺服器應用程式的租用管理員就是決定遠端物件何時標記為記憶體回收的物件。贊助者就是可將本身註冊到租用管理員以要求特定物件之新租用期的物件。

每當在應用程式定義域外部遠端處理了 MBR 物件,就會為該物件建立存留期租用期。每一個應用程式定義域都包含租用管理員,負責管理其定義域中的租用期。租用管理員會定期檢查所有租用期是否過期。如果租用期過期,則租用管理員會將要求傳送到本身對該物件的贊助者清單中,並查詢其中是否有任何贊助者認可要更新租用期。如果沒有贊助者要更新租用期,租用管理員會移除租用期,物件會被刪除,而且執行物件的記憶體也會由記憶體回收行程所回收。如此一來,當贊助者回收物件超過一次,或是持續由用戶端呼叫的話,物件的存留期就會比存留期租用期要來得長一些。

遠端物件的存留期需視本身用戶端的存留期而定。基本物件的租用期也許會很長,在此情況下可供多個用戶端使用。用戶端可能會定義更新物件的租用期,讓物件存留期更長。這個方法能夠有效運用租用期,因為進行分散式記憶體回收只會產生很少數的網路流量。然而,如果用戶端常常以較短的時間來更新使用稀有資源的遠端物件,則該物件的租用期可能包含較短的存留期。當所有用戶端都利用完該遠端物件後,.NET Framework 遠端處理系統就會快速地將物件標記為記憶體回收。這項原則會替代越來越大的網路流量,以便更有效率地運用伺服器資源。

使用租約來管理遠端物件的存留期是另一種參考計數的方式,在不可靠的網路連線上使用此方法會非常複雜而且缺乏效率。儘管您可以設定租用期,將遠端物件的存留期延長為超過標準期限的時間,但是只要您針對特定情況適當加以設定,便可以有效降低參考計數以及傳送要求至用戶端的網路流量,進而讓租用期設定成為很好用的解決方案。

下表說明主要的租用期屬性。

屬性 說明

InitialLeaseTime

在租用管理員開始刪除物件的處理序之前,指定物件保留在記憶體中的初始時間範圍。在組態檔中,就是 <lifetime> 項目 組態項目的 leaseTime 屬性。預設為 5 分鐘。租用期時間 0 可將租用期設為無限存留期。

CurrentLeaseTime

指定租用期到期之前的時間範圍。一旦租用期更新完畢,其 CurrentLeaseTime 就會設為 CurrentLeaseTimeRenewOnCallTime 的最大值。

RenewOnCallTime

指定在每個物件的遠端呼叫之後,所設定的 CurrentLeaseTime 時間範圍最大值。預設為 2 分鐘。

SponsorshipTimeout

指定當租用期已經到期時,租用管理員等待贊助者回應的時間。如果贊助者沒有在指定的時間內回應,就會移除贊助者並呼叫另一個贊助者。如果沒有可用的贊助者,則租用期會到期並將遠端物件標記為記憶體回收。如果值為 0 (TimeSpan.Zero),則租用期不會註冊贊助者。預設為 2 分鐘。

LeaseManagerPollTime

指定在檢查過期的租用期之後,租用管理員睡眠的時間量。預設為 10 秒。

當 MBR 物件在另一個應用程式定義域中啟動時,就會建立租用期。此時,當 ILease.CurrentState 屬性設為 LeaseState.Initial,就可以設定租用期屬性。屬性一旦設定,就不能直接變更。只有 CurrentLeaseTime 可以變更,方法是透過 ILease.Renew 呼叫,或是在租用管理員在贊助者上呼叫 ISponsor.Renewal 時,由贊助者回應 TimeSpan 物件來加以變更。MarshalByRefObject 預設會實作存留期租用期;除非此租用期在建立時一併修改,否則其屬性會永久保持不變。

修改租用期屬性

存留期租用期屬性可透過下列方式來修改:

  • 覆寫 MBR 物件中的 MarshalByRefObject.InitializeLifetimeService 來宣告自訂存留期租用期,以自行設定租用期的屬性,或是傳回 null 參考 (如果是 Visual Basic,則為 Nothing)。後面選項會告訴 .NET Framework 遠端處理系統,此型別的執行個體具有無限的存留期。

  • 開發人員或管理員同時也能透過應用程式的 <lifetime> 項目 項目或電腦組態檔,指定特定應用程式中所有物件的存留期屬性。如需詳細資訊,請參閱初始化租用期

建立好之後,就可以透過下列方式來更新租用期:

  • 用戶端直接呼叫 Renew

  • 如果設定了 ILease.RenewOnCallTime 屬性,則每個對遠端物件的呼叫都會更新租用期的指定時間。

  • 租用期會呼叫 Renewal 方法來要求租用期更新,而贊助者則以 TimeSpan 來回應。

如需詳細資訊,請參閱更新租用期

租用管理員

租用管理員必須定期檢查租用期是否過期。當租用期已經到期,租用期就會收到通知,並嘗試叫用本身的贊助者來更新自己。

租用管理員同時會維護一份贊助者清單,清單內包含等候贊助者回應的租用期。如果贊助者未能於 SponsorshipTimeout 所指定的時間範圍內回應,就會從贊助者清單中移除。

請注意,惡意的遠端用戶端可能濫用租用期系統並發動阻絕服務 (DOS) 攻擊來對付遠端系統。惡意的用戶端會贊助許多租用期,然後拒絕回應伺服器的更新查詢。只有當 TypeFilterLevel 設為 full,才可能發生此類型的 DOS 攻擊。

如果租用期可允許到期,就不會繼續接受後續任何的租用期訊息或贊助者回傳。租用期的參考會從租用期清單中移除,而 .NET Framework 遠端處理系統則會從本身的內部表格中移除物件參考。記憶體回收系統會接著移除租用期與物件。

另請參閱

工作

HOW TO:覆寫 InitializeLifetimeService 介面
HOW TO:更新租用期

參考

遠端設定結構描述
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService

概念

遠端處理範例:存留期
初始化租用期
更新租用期

其他資源

物件啟動與存留期