Как добавить прозрачный клиентский прокси в удаленный объект - PullRequest
1 голос
/ 20 октября 2008

У меня маленькая проблема, которую я не могу понять. У меня есть серверный объект 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 может вызываться только из собственного контекста объекта». Кто-нибудь может указать, как заставить это работать правильно? Мне нужно внедрить некоторый код до и после вызова метода на удаленных объектах. Ура! * * 1004

Ответы [ 2 ]

1 голос
/ 20 октября 2008

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

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 );
    }
}
0 голосов
/ 20 октября 2008

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

Примерно так:

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, установленным для прямого класса

...