Если вы включаете надежные сеансы, WCF внутренне поддерживает механизм контроля активности. Через скрытые тестовые сообщения инфраструктуры он регулярно проверяет, есть ли другой конец. Временной интервал этих проверок может зависеть от свойства ReliableSession.InactivityTimeout. Если вы установите для свойства, скажем, 20 секунд, то событие ICommunicationObject.Fapted будет вызвано примерно через 20–30 (максимум) секунд после того, как на другой стороне произошел сбой службы.
Если вы хотите быть уверены, что клиентские приложения всегда остаются «автоматически подключенными», даже после временных сбоев службы, вы можете использовать рабочий поток (из пула потоков), который неоднократно пытается создать новый экземпляр прокси на клиентская сторона, и вызывает инициирующую сеанс операцию после того, как там возникло событие Faults.
В качестве второго подхода, поскольку в любом случае вы реализуете механизм рабочего потока, вы также можете игнорировать событие Faulted и позволить циклу рабочего потока в течение всего времени жизни клиентского приложения. Вы позволяете потоку неоднократно проверять состояние прокси-сервера и пытаться выполнять его ремонтные работы всякий раз, когда состояние нарушается.
Используя первый или второй подход, вы можете реализовать архитектуру служебной шины (шаблон-посредник), гарантирующую, что все экземпляры клиентских приложений постоянно готовы к получению «спонтанных» служебных сообщений при каждом запуске службы.
Конечно, это работает только в том случае, если надежный сеанс «как таковой» настроен правильно для начала (с использованием привязки к сеансу и применения ServiceContractAttribute.SessionMode, ServiceBehaviorAttribute.InstanceContextMode, OperationContractAttribute.IsInitiating и OperationContractAttribute.atings свойства в значимых отношениях).