Attivazione da server
La durata degli oggetti attivati da server è direttamente controllata dal server. Questi oggetti vengono creati dal dominio di applicazione server solo quando il client esegue una chiamata di metodo sull'oggetto e non quando chiama new (New() in Visual Basic) o Activator.GetObject. In questo modo si evita un percorso di andata e ritorno sulla rete al solo scopo di creare istanze. Nel dominio di applicazione client viene creato solo un proxy quando un client richiede un'istanza di un tipo attivato da server. In questo modo, tuttavia, solo i costruttori predefiniti sono abilitati per i tipi attivati da server quando si utilizzano implementazioni predefinite. Per pubblicare un tipo le cui istanze verranno create con costruttori specifici che accettano argomenti, è possibile utilizzare l'Attivazione da client oppure pubblicare in modo dinamico l'istanza specifica.
Modalità di attivazione da server
Sono disponibili due modalità di attivazione (o valori WellKnownObjectMode) per gli oggetti attivati da server, ovvero Singleton e SingleCall.
Nei tipi Singleton non è mai presente più di un'istanza alla volta. Se esiste, l'istanza serve tutte le richieste dei client. Se non è presente alcuna istanza, il server ne crea una con la quale verranno servite tutte le richieste successive dei client. Poiché ai tipi Singleton è associata una durata predefinita, i client non ricevono sempre un riferimento alla stessa istanza della classe remotizzabile, anche se non è mai disponibile più di un'istanza alla volta.
Nei tipi SingleCall è sempre presente un'istanza per richiesta client. La chiamata di metodo successiva verrà servita da una diversa istanza del server, anche se l'istanza precedente non è ancora stata riciclata dal sistema. I tipi SingleCall non partecipano al sistema di lease di durata.
Per creare un'istanza di un tipo attivato da server, i client configurano l'applicazione a livello di programmazione o mediante un file di configurazione e chiamano new oppure passano la configurazione dell'oggetto remoto in una chiamata ad Activator.GetObject.
Nota
Potrebbe non essere necessario registrare il canale sul lato client. Se non è registrato dal client, il canale viene scelto o creato automaticamente dal sistema .NET Remoting mediante uno dei canali predefiniti specificati nel file Machine.config per eseguire richieste in uscita. La selezione automatica sul client non consente di registrare il canale per l'attesa di funzioni di callback dal server e, a meno che non venga aggiunto un canale personalizzato al file machine.config, non consente di registrare un'implementazione personalizzata del canale. In questi casi, occorre registrare il tipo di canale desiderato nel dominio di applicazione client.
In questo esempio di codice viene illustrata una chiamata a Activator.GetObject e si suppone che TcpChannel sia stato registrato per comunicare sulla porta 8080. Se al client è noto solo che l'oggetto server implementa un'interfaccia specifica, è necessario utilizzare una chiamata a Activator.GetObject, poiché per creare un'istanza di una classe è possibile utilizzare solo new (New in Visual Basic).
Dim MyRemoteClass As RemoteObjectClass = _
CType( _
Activator.GetObject(GetType(RemoteObjectClass), _
"tcp://computername:8080/RemoteObjectUri" ), _
RemoteObjectClass
)
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
typeof(RemoteObjectClass),
"tcp://computername:8080/RemoteObjectUri "
);
Nella chiamata precedente non viene creato l'oggetto remoto sul server, ma viene semplicemente restituito al client un riferimento al proxy locale per l'oggetto remoto. Il client può continuare a considerare MyRemoteClass
come un riferimento diretto all'oggetto remoto. Il tipo di istanza con la quale il client comunica effettivamente da una chiamata di metodo all'altra dipende dalla dichiarazione dell'oggetto server come tipo Singleton o SingleCall. Indipendentemente dall'esposizione o meno di queste informazioni da parte dell'autore dell'oggetto server, il client considera esattamente allo stesso modo il riferimento all'oggetto di cui dispone.
Singleton
In COM il termine singleton indicava che finché i client disponevano di riferimenti a un oggetto, quest'ultimo non veniva eliminato dalla memoria. In .NET Remoting un oggetto Singleton è invece soggetto al lease di durata specificato e può quindi essere riciclato anche se i client mantengono riferimenti a esso. È possibile creare il tipo di oggetto Singleton precedente eseguendo l'override del metodo InitializeLifetimeService di MarshalByRefObject per restituire un riferimento null (Nothing in Visual Basic). Mediante questa operazione si mantiene l'oggetto in memoria finché è in esecuzione il dominio dell'applicazione host. Per ulteriori informazioni, vedere Lease di durata. È possibile creare il tipo di oggetto Singleton più recente mediante la configurazione del tempo di lease iniziale nel file di configurazione di .NET Remoting.
Vedere anche
Riferimenti
Enumerazione WellKnownObjectMode
Marshal
Concetti
Attivazione di oggetti remoti
Attivazione da client
Lease di durata