Как я могу автоматически восстановить дуплексный канал, если он получил ошибку?

Я разрабатываю клиент/серверное приложение в .NET 3.5 с помощью WCF. В основном, длительное обслуживание клиентов (на нескольких машинах) устанавливает дуплексное соединение с сервером через netTcpBinding. Затем сервер использует контракт обратного вызова клиента для выполнения определенных по требованию oparations, на которые клиент реагирует асинхронно (довольно стандартный материал, который я думаю). Я подклассифицирую класс DuplexClientBase для обработки большей части сообщения.

К сожалению, когда что-то пойдет не так на обоих концах (например, сбой сети, неожиданное исключение и т.д.), канал получает сбои/прерывается, а все последующие операции терпят неудачу. Я обошел это ограничение в недуплексных каналах, создав класс RecoveringClientBase, который автоматически подхватывает, когда клиент сбой и повторяет операцию.

Итак, мой вопрос: существует ли установленный способ определения, когда дуплексный канал сработал? Где я должен проверить это, на сервере или клиенте? В противном случае, какие параметры я должен обеспечить, чтобы соединение было восстановлено?

Обновление: Я ищу несколько советов, специфичных для дуплексных каналов, где сервер может попытаться использовать обратный канал, который был сбит. Таким образом, мне нужно что-то, что будет немедленно повторно подключаться/повторно подписываться, когда что-то происходит с каналом. На данный момент я слушаю событие закрытия канала и воссоздавая его, если состояние ничего не закрыто. Это своего рода работы, но они чувствуют себя взломанными...

Ответы

Ответ 1

У меня возникла хладнокровие в длительных сеансах (минут-часов). Я не могу быть уверен, что это WCF, я уверен, что его уровень сети.

Я думаю об удалении с дуплексом вообще. Это реальная неприятность, пытающаяся управлять состоянием соединения.

Я думаю о размещении конечной точки службы на клиенте для операций, которые в настоящее время являются частью контракта обратного вызова. Клиент свяжется с сервером с данными о конечной точке, сервер может хранить их где-нибудь (сохраняется или где угодно). Когда серверу необходимо связаться с клиентом, он открывает соединение с клиентом через данные о закрытых конечных точках. В основном, превращение дуплексного соединения в 2 соединения клиент-сервер.

Не отвечает на ваш вопрос, но я чувствую вашу боль.

Ответ 2

У Николаса Аллена из команды WCF есть предложения для этого:

http://blogs.msdn.com/drnick/archive/2007/11/05/custom-transport-retry-logic.aspx

Его предложение состоит в том, чтобы справиться с этим на уровне канала. Уровень канала немного лучше, поскольку вы можете подключить его к любому стеку привязки с помощью поведения, а не требовать настраиваемый базовый класс клиента.

Ответ 3

У меня были некоторые подобные проблемы, и для меня кажется, что эти длительные вызовы более или менее неподдерживаются.

WCF, похоже, предназначен для использования для коротких вызовов. Службы, которые вызываются, выполняют некоторые мелочи и заканчиваются.

Я реорганизовал свои приложения на более мелкие элементы работы. Поэтому вместо одного большого длинного предмета теперь у меня появилось много мелких предметов. Конечно, иногда этого достичь невозможно. Затем я должен молиться за стабильные сетевые подключения (исключения могут быть пойманы, поэтому ошибка не является действительно проблемой, я думаю).

Ответ 4

Я думаю, что вам действительно нужно слушать об ошибке. Вы можете прослушивать его на обоих концах, клиентский конец Я думаю, что вы уже обрабатываете, серверный конец - OperationContext.Current.Channel.events.

Я не нашел способ повторно отправить сообщение автоматически по мере того, как ваш канал обратного вызова уже сбой, и вы еще не знаете новый канал обратного вызова, но вам нужно поддерживать тезисы вызовов где-то на сервере до тех пор, пока клиент не заново подключится.

В конечном итоге клиенты будут обмануты и должны пересоздать рукопожатие с сервером, то есть точечный сервер должен отправить неотправленные вызовы.

В принципе, единственный способ восстановления с неисправного/закрытого канала - заменить его на новый, однако самая ключевая часть - это то, что вы должны действительно обнаружить отключенное ON TIME, я нашел, что включение надежного сеанса приведет к сбою во времени события в большинстве случаев. В качестве альтернативы вы можете отправлять сообщения с биением на обоих концах, чтобы "проверить" неисправный канал.