Обработка отброшенных клиентов в приложении WCF с двусторонним связыванием - PullRequest
14 голосов
/ 01 января 2011

Мы используем модель pub-sub в нашем приложении WCF, которая в значительной степени соответствует примеру Microsoft: Шаблоны проектирования: публикация-подписка на основе списка .

Хотя служба предоставляет понятие subscribe() и unsubscribe(), какова лучшая практика для очистки в ситуации, когда клиент умирает или происходит сбой канала? В настоящее время, когда клиент подписывается, я присоединяю к обработчикам текущие события InstanceContext Closed и Faulted (пользователи службы используют контекстный режим экземпляра PerSession и netTcpBinding):

_communicationObject = OperationContext.Current.InstanceContext;
_communicationObject.Closed += OnClientLost;
_communicationObject.Faulted += OnClientLost;

Обработчик OnClientLost просто отписывает клиента, однако:

  1. Является ли вышеизложенное хорошей практикой и достаточно ли она надежна, чтобы уловить все ситуации, когда клиент прерывает дуплексную связь? Или же служба должна обрабатывать исключения, возникающие в тот момент, когда она пытается связаться с клиентом, а затем обрабатывать очистку?
  2. Помимо отмены подписки обработчика обратного вызова клиента, следует ли выполнять дополнительную очистку, особенно в случае ошибки?

Этот вопрос ставит аналогичный вопрос, но в конечном итоге не дает ответов на случаи за пределами клиента, звонящего подписаться и / или отказаться от подписки

Спасибо

Ответы [ 2 ]

8 голосов
/ 20 января 2011

Я провел некоторое тестирование, где я прикрепил обработчики к событиям Closed и Faults канала обратного вызова, а затем убил клиента в точке непосредственно перед вызовом обратного вызова сервером. В каждом испытании событие Closed / Faults вызывалось мгновенно и до того, как сервер попытался вызвать обратный вызов. Тем не менее, у меня все еще есть вызов обратного вызова, обернутый в блок try-catch, потому что разрушение клиентского канала может произойти так же, как другой поток вводил обратный вызов.

Единственной необходимой очисткой было удаление ссылки на канал обратного вызова. WCF и сборщик мусора делают все остальное.

2 голосов
/ 14 января 2011

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

За исключением удаления клиента из списка подписчиков, дополнительная очистка полностью зависит от вашего приложения (т.е. освобождает ресурсы, которые вы приобрели, когда клиент подключился). Я не знаю какой-либо другой очистки, которая требуется.

...