2008-10-20 4 views
1

У меня есть небольшая проблема, которую я не могу понять. У меня есть серверная сторона MarshalByRefObject, которую я пытаюсь обернуть прозрачным прокси-сервером на стороне клиента. Вот установка:Как добавить прозрачный клиентский прокси-сервер к удаленному объекту

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); 
    } 
} 

Проблема заключается в том, что вызов RemotingServices.ExecuteMethod, генерируется исключение с сообщением «ExecuteMessage можно назвать только из родного контекста объекта.». Может ли кто-нибудь указать, как заставить это работать правильно? Мне нужно ввести код до и после вызова метода на удаленных объектах. Ура!

ответ

0

Я сделал это некоторое время назад и забыл точную процедуру, но попробуйте использовать RemotingServices.GetRealProxy, чтобы получить прокси от объекта test и передать его в свой MyProxy и вызвать вызов на нем.

Что-то вроде этого:

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(); 

Вы должны обновить MyProxy класс для работы с RealProxy InstEd прямого класса

1

Понял. ваш комментарий поставил меня на правильный путь. Ключ состоит в том, чтобы развернуть прокси-сервер и вызвать вызов на нем. СПАСИБО!!!!!

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); 
    } 
}