WCF - Как определить, работает ли сервер? - PullRequest
1 голос
/ 17 ноября 2009

Я разрабатываю клиент-серверное приложение с сетевым связыванием tcp, и мне нужно уведомить, если мое соединение с сервером обрывается.

Со стороны сервера, если клиент отключается, я могу обнаружить его немедленно с CommunicationObject. Неисправное событие (с отключением надежного сеанса). Тем не менее, со стороны клиента, кажется, у меня нет возможности узнать, не работает ли сервер. То же событие не срабатывает. Кстати, я устанавливаю receiveTimeout в бесконечность. Некоторые люди предлагали использовать функцию сердцебиения или проверки связи, чтобы проверить, работает ли сервер. Но я думаю, что на уровне WCF такие методики имеют большое влияние. В конце концов, это не простой пакет, который вы отправляете, а весь запрос WCF. Что мне делать?

1 Ответ

3 голосов
/ 07 марта 2010

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

Хитрость заключается в том, чтобы установить ReliableSession.InactivityTimeout на достаточно короткий период. Например, если вы установите его на 30 секунд, то событие ICommunicationObject.Faults будет вызвано на клиентском прокси через 30 (минимум) до подтверждения. 45 (максимум) секунд после отказа службы. Точная задержка зависит от ритма таймера контроля активности внутреннего сеанса WCF и конкретного времени сбоя.

Конечно, это может работать только для привязок с поддержкой надежного сеанса в сочетании с правильными свойствами сеанса (ServiceContractAttribute.SessionMode, ServiceBehaviorAttribute.InstanceContextMode, OperationContractAttribute.IsInitiating и OperationContractAttribute.It.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...