2009-04-09 14 views
14

Sto riscontrando un problema con una classe singleton che sto esponendo tramite remote. Nel mio server ho:Utilizzo di singleton in .Net Remoting

TcpChannel channel = new TcpChannel(Settings.Default.RemotingPort); 
ChannelServices.RegisterChannel(channel, false); 
RemotingConfiguration.RegisterWellKnownServiceType( 
    typeof(RemotableObject), "RemotableObject", 
    WellKnownObjectMode.Singleton); 

RemotableObject è un oggetto Singleton che eredita MarshalByRefObject.

mio client si connette ad esso tramite:

remoteObject = (RemotableObject)Activator.GetObject(
    typeof(RemotableObject), 
    string.Format("tcp://{0}:{1}/RemotableObject", serverIP, serverPort)); 

Tutto funziona alla grande per quanto riguarda la comunicazione remota va, ma quando accedo l'oggetto Singleton nel mio codice del server in questo modo:

int someValue = RemotableObject.Instance.SomeDynamicValue; 

E ' accede a un'istanza diversa da quella dei client. Ho anche verificato che il costruttore privato in RemotableObject venga colpito due volte durante il debug.

Posso ottenere il comportamento desiderato se ottengo un'istanza di RemotableObject tramite remoting nel mio codice server, ma esiste un modo per accedere allo stesso oggetto dei miei client dal server senza il sovraccarico di servizi remoti?

risposta

30

Se ho capito cosa stai cercando, (vuoi che l'oggetto vada sul server, ma vuoi che tutte le chiamate client ottengano la stessa istanza dell'oggetto sul server, e vuoi anche le chiamate nel server ? codice per ottenere lo stesso esempio)

allora, se il server è "NomeServer", ed è in ascolto sulla porta nnnn, con Uri come "MyMsgEndpointUri", si è definito l'Uri, come:

var MesgUri = "tcp://ServerName:nnnn/MyMsgEndpointUri"; 

sul server, Inizializza l'endpoint:

RemotingServices.Marshal([singletonInstance], MesgURI); 

Invece di RegisterWellKnownServiceType();

anche, nella classe che rappresenta il Singleton, ricordarsi di sostituire la proprietà InitializeLifetimeService con un'operazione nulla ... o l'oggetto Singleton otterrà rifiuti raccolti ad un certo punto ...

public override object InitializeLifetimeService() { return (null); } 

Dal server, basta chiamare il metodo factory statici vostre classi singleton per ottenere l'accesso a tale istanza Singleton ... non usare servizi remoti chiamate a tutti ...

+0

Che ha funzionato perfettamente! Grazie per la risposta rapida! – Todd

+0

Quale dovrebbe essere il valore di 'MesgURI'? Il mio canale tcp si chiama 'UsersTcp' e ho provato con quel nome e con uri:' tcp: // localhost: 5000/UserTcp' ed entrambi mi danno un errore di servizio non trovato. – moondaisy

+0

Dovrebbe essere 'tcp: // [ServerName]: [PortNumber]/MesgUri' come in' tcp: // MYSERVERNAME: 5212/UsersTcp' –

-2

No.

Non c'è modo di leggere la memoria del client nel server.

-1

non ho mai provato a chiamare Activator.GetObject dal lato server , ma dovrebbe restituire la stessa istanza utilizzata dai client. Ma otterrai comunque un proxy.

Problemi correlati