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。”。谁能指出如何让它正常工作?我需要在远程对象的方法调用之前和之后注入一些代码。干杯!

4

2 回答 2

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 );
    }
}
于 2008-10-20T19:13:30.147 回答
0

我前一阵子这样做了,忘记了确切的过程,但是尝试使用 RemotingServices.GetRealProxy 从测试对象获取代理并将其传递给您的 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

于 2008-10-20T18:45:13.013 回答