【发布时间】:2020-04-14 18:19:45
【问题描述】:
在两个进程之间使用 .NET 远程处理,我在服务器端插入我自己的 IServerChannel 接收器,这样我就可以拦截客户端启动的方法调用并将它们移动到服务器上的适当线程。我目前正在努力将消息的Uri 转换为服务器对象实例,以便我可以检查它:
public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack,
IMessage requestMsg,
ITransportHeaders requestHeaders,
Stream requestStream,
out IMessage responseMsg,
out ITransportHeaders responseHeaders,
out Stream responseStream)
{
if (requestMsg is MethodCall methodCallMessage)
{
// how do I implement ConvertUriToObjectInstance to convert the Uri to a MarshallByRef instance???
object instance = ConvertUriToObjectInstance(requestMsg.Uri);
}
}
有没有办法将 Uri 转换为服务器创建的对象到实际的 MarshallByRef 实例?
我已经通过文档和参考源查看了System.Runtime.Remoting.Messaging 命名空间/类,但我看不到任何与将 Uri 转换回它所代表的实际实例相关的内容。运行时显然有办法做到这一点,但有没有办法我可以通过官方 api 或利用反射来获得它?
注意我知道我可以通过ContextBoundObject 之类的方式转换线程,但由于它的限制,我会避免使用它——比如 w.r.t.泛型。
【问题讨论】:
-
您不应该转换响应(而不是请求)吗?
-
否;当客户端调用“MyMethodThatShouldRunOnTheUiThreadOnTheServer”时,我想将方法调用转换到 UI 线程。