我有一个客户端(和服务器),在不同的协议上设置了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列表。