我遇到了一个我无法弄清楚的问题。我有一个服务器端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 :(得分:1)
知道了。你的评论让我走上正轨。关键是解包代理并在其上调用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 );
}
}
答案 1 :(得分: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