2008-10-20 8 views
1

J'ai un petit problème que je n'arrive pas à comprendre. J'ai un côté serveur MarshalByRefObject que j'essaie d'enrouler un proxy transparent autour du côté client. Voici la configuration:Comment ajouter un proxy côté client transparent à un objet distant

public class ClientProgram { 
    public static void Main(string[] args) { 
     ITest test = (ITest)Activator.GetObject(typeof(ITest), "http://127.0.0.1:8765/Test.rem"); 
     test = (ITest)new MyProxy(test).GetTransparentProxy(); 
     test.Foo(); 
    } 
} 

public class MyProxy : RealProxy { 

    private MarshalByRefObject _object; 

    public MyProxy(ITest pInstance) 
     : base(pInstance.GetType()) { 
     _object = (MarshalByRefObject)pInstance; 
    } 

    public override IMessage Invoke(IMessage msg) { 
     return RemotingServices.ExecuteMessage(_object, (IMethodCallMessage)msg); 
    } 
} 

Le problème est que l'appel à RemotingServices.ExecuteMethod, une exception est levée avec le message « ExecuteMessage peut être appelé que dans le contexte natif de l'objet. ». Quelqu'un peut-il indiquer comment cela fonctionne correctement? J'ai besoin d'injecter du code avant et après les appels de méthode sur les objets distants. À votre santé!

Répondre

0

Je l'ai fait il y a un certain temps et j'ai oublié la procédure exacte, mais essayez d'utiliser RemotingServices.GetRealProxy pour obtenir un proxy de test objet et passez-le dans votre MyProxy et invoquez-le dessus.

Quelque chose comme ceci:

ITest test = (ITest)Activator.GetObject(typeof(ITest), "http://127.0.0.1:8765/Test.rem"); 
RealProxy p2 = RemotingServices.GetRealProxy(test) 
test = (ITest)new MyProxy(p2).GetTransparentProxy(); 
test.Foo(); 

Vous devez mettre à jour MyProxy classe pour travailler avec RealProxy insted de classe directe

1

a obtenu. votre commentaire m'a mis sur la bonne voie. La clé est de déballer le proxy et d'appeler invoke dessus. JE VOUS REMERCIE!!!!!

public class ClientProgram { 
     public static void Main(string[] args) { 
      ITest test = (ITest)Activator.GetObject(typeof(ITest), "http://127.0.0.1:8765/Test.rem"); 
      ITest test2 = (ITest)new MyProxy(test).GetTransparentProxy(); 
      test2.Foo(); 
     } 
    } 

public class MyProxy : RealProxy { 

    private object _obj; 

    public MyProxy(object pObj) 
     : base(typeof(ITest)) { 
     _obj = pObj; 
    } 

    public override IMessage Invoke(IMessage msg) { 
     RealProxy rp = RemotingServices.GetRealProxy(_obj); 
     return rp.Invoke(msg); 
    } 
}