如何向远程对象添加透明客户端代理

本文关键字:添加 透明 客户端 代理 对象 程对象 | 更新日期: 2023-09-27 17:48:48

我遇到了一个无法解决的小问题。我有一个服务器端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。"。有人能指出如何使其正常工作吗?我需要在方法调用远程对象之前和之后注入一些代码。干杯

如何向远程对象添加透明客户端代理

明白了。你的评论让我走上了正轨。关键是打开代理并对其调用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 );
    }
}

我不久前就这么做了,忘记了确切的过程,但尝试使用RemotingServices.GetRealProxy从测试对象中获取代理,并将其传递到MyProxy中,并对其调用invoke。

类似这样的东西:

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,而不是直接类