Мы используем модель pub-sub в нашем приложении WCF, которая в значительной степени соответствует примеру Microsoft: Шаблоны проектирования: публикация-подписка на основе списка .
Хотя служба предоставляет понятие subscribe()
и unsubscribe()
, какова лучшая практика для очистки в ситуации, когда клиент умирает или происходит сбой канала? В настоящее время, когда клиент подписывается, я присоединяю к обработчикам текущие события InstanceContext
Closed
и Faulted
(пользователи службы используют контекстный режим экземпляра PerSession и netTcpBinding):
_communicationObject = OperationContext.Current.InstanceContext;
_communicationObject.Closed += OnClientLost;
_communicationObject.Faulted += OnClientLost;
Обработчик OnClientLost
просто отписывает клиента, однако:
- Является ли вышеизложенное хорошей практикой и достаточно ли она надежна, чтобы уловить все ситуации, когда клиент прерывает дуплексную связь? Или же служба должна обрабатывать исключения, возникающие в тот момент, когда она пытается связаться с клиентом, а затем обрабатывать очистку?
- Помимо отмены подписки обработчика обратного вызова клиента, следует ли выполнять дополнительную очистку, особенно в случае ошибки?
Этот вопрос ставит аналогичный вопрос, но в конечном итоге не дает ответов на случаи за пределами клиента, звонящего подписаться и / или отказаться от подписки
Спасибо