У меня есть клиент (и сервер) с двумя каналами, настроенными на разные протоколы, скажем, X: // и Y: //.
Если я вызываю службу (через удаленное взаимодействие) с клиента (C) на сервере (S), который должен выполнить обратный вызов клиенту (так S-> C), есть ли способ указать, какой канал использовать? В моем случае я хочу, чтобы любые вызовы из X: // вызывали обратный вызов через X: //, а любые вызовы через Y: // вызывали обратный вызов через Y: //.
Мое текущее решение состоит в том, чтобы реализовать собственный суррогат сериализации (и селектор) для каждого канала для MarshalByRefObjects, который удаляет URI другого канала из SerializationInfo при их сериализации. Аналогично:
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();
Это на самом деле работает, но чувствует себя неправильно (например: полагаться на строку "channelInfo" в заполненном SerializationInfo). Кто-нибудь знает лучшее решение? Я довольно тщательно просмотрел RemotingServices.GetObjectData, но все еще не мог понять, откуда он получает список URI.