Проблема регистрации TcpChannel - PullRequest
0 голосов
/ 21 января 2010

Я прочитал здесь: Ошибка 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 (...) быть причиной "уже зарегистрированной" проблемы. Итак, кроме этого, я в растерянности ...

Возможно, что вызов, который я делаю, чтобы проверить этот канал, вызывает его. Если это консенсус, то мой вопрос меняется на: Как я могу опросить канал?

UPDATE: После удаления первоначальной проверки сервера с клиента и «предположения», что сервер должен быть создан, я обнаружил, что проверка клиента вызывает проблему. Мне удалось запустить сервер, и клиент получил объект «Прозрачный прокси». Но все еще остается вопрос: «Как я могу опрашивать, чтобы узнать, установлен ли сервер?»

1 Ответ

0 голосов
/ 21 января 2010

Ответ очевиден, да ... когда клиент регистрирует канал, он не дает серверу регистрировать другой канал Tcp. Я удалил экземпляр клиента Tcp-канала и регистрацию.

Поскольку я не получил ответа на команду ping, я пытаюсь выполнить блок try / catch для объекта obj = Activator.GetObject (...). Если obj возвращается null, то я «подталкиваю» сервер, он запускается ... и затем клиент соединяется с CommonDataObject (производным от MarshalByRefObject).

Итак, в некотором смысле, это техника опроса, которую я использую. Я хотел бы что-то более элегантное - то есть реализацию, которая не работала, вызывая сбой. Для меня это скорее обходной путь взлома, чем решение.

Я нашел ответ здесь . Спасибо Abhijeet за непреднамеренное решение !!! Кстати ... не забудьте объявить:

using System.Linq;
...