Есть приложение, к-рое запускают в большом кол-ве на одной машине.
Внутри приложения есть функциональность, к-рая работает лишь в одном экземпляре приложения, но необходима всем другим экземплярам. Я хочу реализовать доступ к этой функциональности через ремоутинг (серверная активация SingleCall). Приложение, к-рое запущенно первым становится сервером, остальные клиентами.
Теперь вопрос:
Если серверное приложение закрывается, то одно из клиентский должно стать сервером.
Как это реализовать, другими словами, как после вызова RegisterWellKnownClientType(...) вызвать RegisterWellKnownServiceType(...) для того же класса?
Здравствуйте, Максим Алексейкин, Вы писали:
МА>Есть приложение, к-рое запускают в большом кол-ве на одной машине. МА>Внутри приложения есть функциональность, к-рая работает лишь в одном экземпляре приложения, но необходима всем другим экземплярам. Я хочу реализовать доступ к этой функциональности через ремоутинг (серверная активация SingleCall). Приложение, к-рое запущенно первым становится сервером, остальные клиентами.
МА>Теперь вопрос:
МА>Если серверное приложение закрывается, то одно из клиентский должно стать сервером. МА>Как это реализовать, другими словами, как после вызова RegisterWellKnownClientType(...) вызвать RegisterWellKnownServiceType(...) для того же класса?
Это тебе скорее в дизайн надо. Алгоритмов есть несколько, чаще всего используется примерно следующий: если в сети нет сервера то назначаются выборы, в ходе которых по определенным признакам выбирается оптимальный. После этого он становится сервером.
Здравствуйте, AndrewVK, Вы писали:
AVK>Это тебе скорее в дизайн надо. Алгоритмов есть несколько, чаще всего используется примерно следующий: если в сети нет сервера то назначаются выборы, в ходе которых по определенным признакам выбирается оптимальный. После этого он становится сервером.
С алгоритмом выбора как раз нет проблем, захватил мьютекс и все ОК. Зона действия ограничена одной машиной. Ремоутинг используется для межпроцесного взаимодействия. Проблема в том, что зарегистрировав клиент я не могу его сделать сервером.
Выскакивает exception:
"Attempt to register a well-known or activated service type of type 'MyType'. This is not allowed since the type has already been redirected activate elsewhere."
Как его разрегистрировать и деактивировать? Не грузить же модуль в отдельный домен
Здравствуйте, Максим Алексейкин, Вы писали:
МА>Выскакивает exception: МА>"Attempt to register a well-known or activated service type of type 'MyType'. This is not allowed since the type has already been redirected activate elsewhere."
Не используй вобще эту фичу на клиенте и поднимай удаленные объекты активатором.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Максим Алексейкин, Вы писали:
МА>>В смысле? я что в этом случае не должен регить ремоутинг тип на клиенте?
AVK>Ага.
Thanx a lot
все заработало.
Случайно не знаешь как для сокета, который используется каналом задать ReuseAddress.
Пока я сделал так:
IPEndPoint ep = new IPEndPoint(IPAddress.Any, PORT);
_socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
_socket.Bind(ep);
_socket.SetSocketOption(
SocketOptionLevel.Socket,
SocketOptionName.ReuseAddress,
1);
_socket.Close();
// дальше регистрирую канал