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