У меня есть клиент GUI, который работает против сервисы WCF, размещенные как служба Windows на поле сервера. Услуга WCF работает в PerCall InstanceContextMode, и у клиента есть одноэлементный экземпляр сервисного клиента, и я не хочу повторно инстанцировать одиночного элемента на каждом вызове, поскольку она делает жизнь трудной для многих асинхронных вызовов, которые я имею.
Проблема для меня, после того, как служба Windows перезапущена, каждый раз клиент звонит ей, получает сообщение об исключении как это:
Этот канал больше не может использоваться для отправки сообщений, поскольку выходная сессия была автозакрыта из-за инициируемого сервером завершения работы. Любой отключает авторядом с установкой DispatchRuntime. AutomaticInputSessionShutdown ко лжи, или рассматривают изменение протокола завершения работы с удаленным сервером.
Что лучший способ состоит в том, чтобы обойти это? Я могу поместить пункты выгоды попытки вокруг всех вызовов сервисному клиенту и повторно инстанцировать одноэлементного экземпляра на коммуникационных исключениях, но это включит много шаблонного кода..
Лучше всего было бы избежать исключений на сервере все вместе. Если сервер WCF столкнется с исключением, которое не будет перехвачено и обработано, он "откажет" каналу, что сделает его бесполезным.
На стороне сервера вы можете реализовать интерфейс IErrorHandler и перехватить .NET исключения, превратив их в ошибки SOAP, которые будут переданы клиенту более изящно, без сбоев канала.
Таким образом, вы можете перехватить все исключения . NET исключений на сервере, и превратить их в неисправности SOAP, которые не вызовут этих проблем.
Для получения дополнительной информации смотрите:
Можно посмотреть на это, чтобы, возможно, избежать некоторого кода этой шаблонной платы: