Проблема с регистрацией TcpChannel
Вопрос
Я прочитал здесь: Ошибка 10048 при попытке открыть TcpChannel
У меня, как я думал, аналогичная проблема - видимо, нет.Я воспользовался советом первого респондента и сбросил Winsock (как вообще Winsock повреждается?). В любом случае, вот моя регистрация канала:
channel = new TcpChannel(channelPort);
ChannelServices.RegisterChannel(channel, false);
и клиентский вызов:
// Create a channel for communicating w/ the remote object
// Notice no port is specified on the client
TcpChannel channel = new TcpChannel();
ChannelServices.RegisterChannel(channel, false);
// Create an instance of the remote object
CommonDataObject obj = Activator.GetObject( typeof(CommonDataObject) ,
"tcp://localhost:49500/CommonDataObject") as CommonDataObject;
Это кажется слишком простым, чтобы доставлять столько хлопот в использовании.Но проблема, похоже, связана с ChannelServices.RegisterChannel(...) сервера.Причина, по которой я включил клиентскую часть, заключается в том, что экземпляры клиента проверяют объект сервера.Если он не может его найти, он «подталкивает» сервер к созданию экземпляра самого себя.Что мне было интересно, так это проверка доступности объекта в первую очередь (а-ля:Activator.GetObject(...) ) заставит ChannelServices «думать», что этот TCP-канал уже зарегистрирован?Это звучит глупо, но это мое единственное возможное объяснение.Я отключил брандмауэр, противогрибковое приложение и перезагрузился.Все еще получаю это
Канал «TCP» уже зарегистрирован.
Я посмотрел на трассировку стека и заметил:
at System.Runtime.Remoting.Channels.ChannelServices.RegisterChannelInternal(IChannel chnl, Boolean ensureSecurity)
at System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(IChannel chnl, Boolean ensureSecurity)
Я задавался вопросом, может ли RegisterChannelInternal(...) быть причиной проблемы «уже зарегистрировано».Так что, кроме этого, я в растерянности...
Возможно, причиной этого является вызов, который я делаю, чтобы проверить этот канал.Если это консенсус, то мой вопрос меняется на:Как я могу проголосовать за канал?
ОБНОВЛЯТЬ:Удалив первоначальную проверку сервера с клиента и «предположив», что сервер необходимо создать экземпляр, я обнаружил, что проблема связана с проверкой клиента.Мне удалось запустить сервер, и клиент получил объект «прозрачный прокси».Но вопрос все равно остается:«Как я могу опросить, есть ли экземпляр сервера?»
Решение
Ответ, очевидно, да... когда клиент регистрирует канал, он не позволяет серверу зарегистрировать другой канал Tcp.Я удалил клиентский экземпляр канала TCP и регистрацию.
Поскольку я не получил ответа на пинг, я использую блок try/catch в obj = Activator.GetObject(...).Если obj возвращает значение null, я «подталкиваю» сервер, он запускается... а затем клиент подключается к CommonDataObject (полученному из MarshalByRefObject).
В каком-то смысле я использую именно эту технику опроса.Мне бы хотелось чего-то более элегантного, то есть реализации, которая не работала, вызывая сбой.Для меня это скорее обходной путь, чем решение.
Я нашел ответ здесь.Спасибо Абхиджиту за нечаянное решение!!!Кстати... не забудьте объявить:
using System.Linq;