Lease di durata
Questo argomento è specifico di una tecnologia legacy mantenuta per una questione di compatibilità con le applicazioni esistenti di versioni precedenti e non è consigliato per il nuovo sviluppo. Le applicazioni distribuite devono ora essere sviluppate utilizzando Windows Communication Foundation (WCF).
Gli oggetti con marshalling per riferimento (marshal-by-reference, MBR) non risiedono per sempre in memoria, sia che siano oggetti Singleton attivati dal server che oggetti attivati dal client. Al contrario, a meno che il tipo non esegua l'override di MarshalByRefObject.InitializeLifetimeService, al fine di controllare i propri criteri di durata, ogni MBR ha una durata che viene controllata da lease, gestore di lease e alcuni sponsor. In questo caso, la durata dell'oggetto MBR corrisponde al tempo totale per il quale l'oggetto rimane attivo in memoria. Un lease è il periodo di tempo per il quale un particolare oggetto è attivo in memoria prima che il sistema .NET Framework Remoting inizi la sua eliminazione e il recupero della memoria. Il gestore di lease del dominio dell'applicazione server è l'oggetto che determina quando l'oggetto remoto è contrassegnato per il Garbage Collection. Uno sponsor è un oggetto che può richiedere un nuovo lease per un particolare oggetto registrandosi con il gestore di lease.
Ogni qualvolta un oggetto MBR viene inviato in remoto fuori da un dominio applicazione, viene creato un lease di durata per quell'oggetto. Ogni dominio applicazione contiene un gestore di lease responsabile dell'amministrazione dei lease nel proprio dominio. Il gestore di lease esamina periodicamente tutti i lease per individuare eventuali lease scaduti. Se un lease è scaduto, il gestore di lease invia una richiesta all'elenco di sponsor per quell'oggetto e controlla se qualcuno fra loro si sta occupando di rinnovare il lease. Se nessuno sponsor rinnova il lease, il gestore di lease rimuove il lease, l'oggetto viene eliminato e la memoria viene recuperata mediante Garbage Collection. La durata di un oggetto, quindi, può essere molto più lunga del suo lease di durata, se rinnovato più di una volta da uno sponsor o chiamato continuamente dai client.
La durata di un oggetto remoto è indipendente dalla durata dei client. Il lease di un oggetto di base potrebbe essere molto lungo, in quel caso l'oggetto potrà essere utilizzato da più client. Il lease dell'oggetto può essere rinnovato periodicamente da un client, cosa che tiene l'oggetto attivo più a lungo. Questo approccio utilizza i lease in maniera efficiente, poiché il traffico di rete necessario per il Garbage Collection distribuito è molto ridotto. Gli oggetti remoti che utilizzano risorse limitate, tuttavia, possono avere un lease di breve durata, che un client si occupa di rinnovare frequentemente in un intervallo di tempo ridotto. Quando tutti i client hanno completato le operazioni sull'oggetto remoto, il sistema .NET Framework Remoting contrassegna subito l'oggetto per il Garbage Collection. Questi criteri sopperiscono all'incremento del traffico di rete con un utilizzo più efficiente delle risorse del server.
L'utilizzo di lease per gestire la durata degli oggetti remoti è un approccio alternativo al conteggio dei riferimenti, che può rivelarsi complesso e inefficiente su connessioni di rete inaffidabili. Anche se i lease possono essere configurati per estendere la durata di un oggetto remoto più a lungo del necessario, la riduzione del traffico di rete dedicato al conteggio dei riferimenti e all'invio delle richieste ai client, rende il leasing una soluzione interessante se configurato correttamente per un particolare scenario.
Nella tabella seguente sono descritte le proprietà principali dei lease.
Proprietà | Descrizione |
---|---|
InitialLeaseTime |
Specifica l'intervallo di tempo iniziale per cui un oggetto rimane in memoria prima che il gestore di lease inizi l'eliminazione dell'oggetto. Nel file di configurazione, questo è l'attributo leaseTime dell'elemento di configurazione Elemento <lifetime>. Il valore predefinito è 5 minuti. Una durata di lease di 0 imposta il lease su una durata infinita. |
CurrentLeaseTime |
Specifica l'intervallo di tempo rimasto prima della scadenza del lease. Quando un lease viene rinnovato, il suo CurrentLeaseTime viene impostato sul massimo del CurrentLeaseTime o sul RenewOnCallTime. |
RenewOnCallTime |
Specifica il massimo intervallo di tempo su cui è impostato CurrentLeaseTime dopo ogni chiamata remota all'oggetto. Il valore predefinito è 2 minuti. |
SponsorshipTimeout |
Specifica l'intervallo di attesa del manager di lease per la risposta dello sponsor quando viene notificato che un lease è scaduto. Se lo sponsor non risponde entro l'intervallo di tempo specificato, lo sponsor viene eliminato, e viene chiamato un altro sponsor. Se non ci sono più sponsor, il lease scade e l'oggetto remoto viene contrassegnato per il Garbage Collection. Se il valore è 0 (TimeSpan.Zero), il lease non registra sponsor. Il valore predefinito è 2 minuti. |
LeaseManagerPollTime |
Specifica l'intervallo di tempo di inattività del manager di lease dopo il controllo dei lease scaduti. Il valore predefinito è 10 secondi. |
I lease vengono creati quando un oggetto MBR viene attivato in un altro dominio applicazione. In quel momento, quando la proprietà ILease.CurrentState è LeaseState.Initial, possono essere impostate le proprietà del lease. Una volta impostate, non sarà possibile modificarle direttamente. Solo il valore CurrentLeaseTime può essere modificato, o da una chiamata ILease.Renew o quando il gestore di lease chiama ISponsor.Renewal su uno sponsor e lo sponsor risponde con un oggetto TimeSpan. MarshalByRefObject ha l'implementazione predefinita di un lease di durata e a meno che questo lease non venga modificato quando viene creato, le proprietà del lease saranno sempre le stesse.
Modifica delle proprietà di lease
Le proprietà del lease di durata possono essere modificate nei seguenti modi:
Dichiarando proprietà di lease di durata personalizzate eseguendo l'override di MarshalByRefObject.InitializeLifetimeService nell'oggetto MBR, o per impostare le proprietà sul lease o per restituire un riferimento null (Nothing in Visual Basic). La seconda opzione comunica al sistema .NET Framework Remoting che istanze di questo tipo hanno una durata infinita.
Uno sviluppatore o un amministratore può anche specificare proprietà di durata per tutti gli oggetti in una particolare applicazione nell'elemento Elemento <lifetime> nel file di configurazione dell'applicazione o del computer. Per ulteriori informazioni, vedere Inizializzazione dei lease.
Una volta creato, un lease può essere rinnovato nei seguenti modi:
Un client chiama direttamente Renew.
Se la proprietà ILease.RenewOnCallTime è impostata, ogni chiamata all'oggetto remoto rinnova il lease per l'intervallo di tempo specificato.
Il lease chiama un metodo Renewal per richiedere un rinnovo del lease e lo sponsor risponde con un TimeSpan.
Per informazioni dettagliate, vedere Rinnovo dei lease.
Gestori di lease
I gestori di lease devono esaminare periodicamente i lease per individuare eventuali scadenze. Quando la durata di un lease è scaduta, il lease viene informato e tenta di rinnovarsi richiamando gli sponsor.
Il gestore di lease gestisce anche un elenco di sponsor dai quali i lease attendono risposte. Se uno sponsor non risponde nell'intervallo di tempo specificato da SponsorshipTimeout, viene rimosso dall'elenco degli sponsor.
Si noti che è possibile che un client .NET Remoting malintenzionato abusi del sistema di lease per sferrare un attacco Denial of Service (DoS) contro un server .NET Remoting. Il client malintenzionato sponsorizza molti lease e quindi rifiuta di rispondere alle richieste di rinnovo del server. Questo attacco DoS è possibile solo se TypeFilterLevel è impostato su full.
Quando a un lease viene concesso di scadere, non vengono accettati ulteriori messaggi di lease o restituzioni dagli sponsor. Il riferimento del lease viene rimosso dall'elenco dei lease e il sistema .NET Framework Remoting rimuove il riferimento all'oggetto dalla tabella interna. Il sistema di Garbage Collection elimina quindi il lease e l'oggetto.
Vedere anche
Attività
Procedura: eseguire l'override dell'interfaccia InitializeLifetimeService
Procedura: rinnovare un lease
Riferimento
Schema delle impostazioni remote
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService
Concetti
Esempio di .NET Remoting: durate
Inizializzazione dei lease
Rinnovo dei lease