Вопрос

Я прочитал здесь: Ошибка 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top