Estensione di RealProxy

L'estensione del proxy può risultare utile quando si desidera partecipare, tra l'altro, al processo di creazione del proxy, al marshalling o all'identità dell'oggetto. È possibile generare il proprio proxy mediante la classe RealProxy estensibile. Per generare un proxy personalizzato, occorre derivare una classe dalla classe RealProxy ed eseguire l'override del metodo RealProxy.Invoke. È possibile intercettare l'istruzione new (New in Visual Basic) mediante la derivazione dall'attributo ProxyAttribute e l'applicazione dell'attributo a un figlio di ContextBoundObject. Non è supportata l'applicazione dell'attributo proxy a un figlio di MarshalByRefObject. Quando si chiama new, mediante l'attributo ProxyAttribute derivato viene creata un'istanza del proxy personalizzato. È anche possibile creare direttamente un'istanza del proxy personalizzato nell'applicazione.

Quando un metodo è chiamato tramite il codice applicazione su un proxy personalizzato, il metodo RealProxy.Invoke sottoposto a override viene chiamato con un oggetto che implementa IMessage. L'implementazione di IMessage fornisce un'implementazione di IDictionary che rende disponibili coppie di informazioni nome/valore relative al metodo. Per ulteriori informazioni su determinate voci del dizionario, vedere la documentazione di riferimento sull'interfaccia IMessage e le interfacce correlate, IMethodCallMessage e IMethodReturnMessage.

Per chiamare un oggetto reale dal metodo Invoke sottoposto a override, chiamare RemotingServices.ExecuteMessage per inviare la chiamata all'oggetto reale.

È anche possibile utilizzare il metodo EnterpriseServicesHelper.CreateConstructionReturnMessage per elaborare un'implementazione di IConstructionCallMessage e generare un'implementazione di IConstructionReturnMessage. Per creare l'oggetto di supporto, inoltre, è possibile utilizzare il metodo RealProxy.InitializeServerObject.

Quando si utilizza l'attributo ProxyAttribute derivato, è possibile creare un oggetto reale nel metodo ProxyAttribute.CreateInstance del quale è stato eseguito l'override e memorizzarlo come campo nel proxy personalizzato. Il proxy personalizzato può effettuare il marshalling dell'oggetto reale per ottenere l'oggetto ObjRef contenente l'URI (Uniform Resource Identifier), il quale deve essere memorizzato nel proxy, poiché la voce "__Uri" contenuta nell'insieme restituito dalla proprietà IMessage.Properties deve essere impostata nell'implementazione di IMessage per consentire l'invio di una chiamata a un oggetto reale.

Il messaggio non deve ovviamente essere inviato su un oggetto reale; è possibile utilizzarlo per eseguire alcune attività in Invoke, nonché generare e restituire un oggetto che implementi l'interfaccia IMethodReturnMessage.

Per partecipare al marshalling, eseguire l'override di RealProxy.CreateObjRef e fornire un oggetto ObjRef personalizzato che estenda ObjRef. Per aggiungere dati personalizzati all'oggetto ObjRef personalizzato, eseguire l'override di GetObjectData. Dati e delegato personalizzati vengono aggiunti al metodo ObjRef.GetObjectData per modificare le funzionalità relative all'identità dell'oggetto del sistema di marshalling di .NET Remoting.

Nel corso della deserializzazione, mediante il sistema remoto viene chiamato IObjectReference.GetRealObject, sottoposto a override, sull'oggetto ObjRef personalizzato. È necessario delegare il metodo ObjRef.GetRealObject di base poiché esso gestirà l'identità dell'oggetto e imposterà i canali di comunicazione remota. Anche il metodo ProxyAttribute.CreateProxy sottoposto a override verrà chiamato dalla base per consentire di impostare il proxy personalizzato.

È possibile utilizzare ObjRef.IsFromThisAppDomain e ObjRef.IsFromThisProcess per determinare le modalità di esecuzione dell'unmarshalling.

Se nel corso del marshalling non viene fornito un oggetto ObjRef personalizzato, il sistema di comunicazione remota eseguirà automaticamente il marshalling e l'unmarshalling dell'oggetto e il proxy personalizzato non verrà utilizzato nel dominio applicazione del chiamante.

Vedere anche

Comunicazione remota avanzata | RealProxy | ProxyAttribute | RemotingServices | IMessage | IMethodReturnMessage | IMethodCallMessage