У меня есть следующая схема обслуживания:
- RoutingService как IDuplexSessionRouter, самодостаточный, общедоступный через net.tcp, настроенный для пересылки запросов в root / IService1 в службу A, / IService2 в службу B и т. Д.
- Служба A, как IService1, дуплексная, самостоятельная, с сеансами, по net.pipe со случайным путем
- Служба B в качестве IService2, дуплексная, самостоятельная, с сеансами, по net.pipe со случайным путем
- ...
- Сервис *, ..
Я делаю это потому, что не хочу иметь порт для каждой из служб и не хочу использовать общий доступ к портам.
Проблема, с которой я столкнулся, заключается в том, что когда я размещаю Service A в ServiceHost с привязкой net.tcp, использую фабрику каналов, чтобы открыть канал и начать сеанс, вызвав метод, а затем закрыть или прекратить ServiceHost, я может наблюдать событие Failed или Closed на интерфейсе ICommunicationObject клиентского канала. Когда служба находится за RoutingService, я получаю сбойное событие только после вызова метода в службе. В противном случае клиент все еще думает, что он подключен.
Так что мне интересно, можно ли как-то убедить RoutingService закрыть сеанс клиента, когда основной канал неисправен? Единственный способ добиться этого - постоянно вызывать операцию пульса в службе, стоящей за RoutingService.