我有一个客户端(和服务器),在不同的协议上设置了 2 个通道,比如说 X:// 和 Y://。
如果我在需要对客户端执行回调的服务器 (S) 上从客户端 (C) 调用服务(通过远程处理)(因此 S-> C),是否有办法指定要使用的通道?在我的用例中,我希望来自 X:// 的任何调用都通过 X:// 回调,并且任何通过 Y:// 的调用都通过 Y:// 回调。
我当前的解决方案是为 MarshalByRefObjects 的每个通道实现自定义序列化代理(和选择器),在序列化它们时从 SerializationInfo 中删除另一个通道的 URI。如同:
RemotingServices.GetObjectData(obj, info, context);
IChannelInfo channelInfo = (IChannelInfo)info.GetValue("channelInfo", typeof(IChannelInfo));
channelInfo.ChannelData = channelInfo.ChannelData.Where(x =>
{
ChannelDataStore ds = x as ChannelDataStore;
if (ds != null)
{
if (!(ds.ChannelUris.Length > 0 && ds.ChannelUris[0].StartsWith("Y://")))
{
return true;
}
else
{
return false;
}
}
return true;
}).ToArray();
这实际上可行,但感觉不对(例如:依赖填充的 SerializationInfo 中的“channelInfo”字符串)。有谁知道更好的解决方案?我已经通过 RemotingServices.GetObjectData 进行了非常彻底的查看,但仍然无法弄清楚它从哪里获取 URI 列表。