Вызов метода для удаленного объекта никогда не возвращается (.NET Remoting) - PullRequest
2 голосов
/ 11 марта 2011

Проблема возникает после перезапуска сервера удаленного взаимодействия.

  1. Клиент, сервер успешно регистрируют свои каналы

  2. Клиент успешно вызывает метод на удаленном компьютереобъект

  3. Я вручную перезагружаю сервер

  4. Клиент снова вызывает метод, но на этот раз вызов метода никогда не возвращает

Если клиент использует соединения keep-alive, я ожидал, что предыдущее соединение не будет установлено, и клиент установит другое соединение с HTTP-каналом сервера.Я попытался настроить клиентский канал с тайм-аутом, а также установить время жизни объекта в несколько секунд, но ничего не получалось.Есть идеи?

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Я бы предложил перейти к WCF, это гораздо лучше поддерживаемая технология для этого сценария.Поведение WCF в этом случае заключается в обнаружении разорванного соединения при каждом вызове RPC и предоставлении вам исключения в ответ.Он не имеет встроенной логики повторения, вам придется обернуть свой клиентский код в обработку исключений, которая отправляет повтор.По крайней мере, он не будет просто зависать и не возвращаться, поэтому вам не придется писать собственный код обработки тайм-аута / отмены.

Обратите внимание, что период подключения WCF может быть длительным (~ 30 секунд при включенном IPv6клиент для подключения, время ожидания 60 секунд для уже установленного соединения, которое разрывается из-за ненормально отключенного сервера), поэтому, если ваши требования к задержке для обнаружения разорванного соединения более жесткие, вам все равно нужно написать собственную логику тайм-аута / отмены.Например, если вы выполняете сетевой RPC в ответ на действие пользователя по обновлению пользовательского интерфейса, вы можете захотеть иметь более короткое время ожидания, чем 30-60 секунд.Будьте осторожны, чтобы сделать его слишком коротким, поскольку соединениям IPv6 может потребоваться от 20 до 30 секунд, чтобы время от времени успешно согласовывать соединение.Это происходит из-за всех согласований совместимости / туннелирования IPv6 / IPv4, которые происходят за кулисами основного соединения TCP / IP.

1 голос
/ 11 марта 2011

Клиент использует прокси удаленного объекта, который больше не подключен. Насколько я знаю, приличного поведения по умолчанию нет. Вам придется проверять состояние удаленного доступа перед каждым вызовом и также создавать код тайм-аута.

...