Как вы указываете канал .NET Remoting будет использовать для выполнения обратного вызова - PullRequest
2 голосов
/ 07 октября 2010

У меня есть клиент (и сервер) с двумя каналами, настроенными на разные протоколы, скажем, 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.

...