WCF Надежный сеанс был ошибочным - PullRequest
0 голосов
/ 25 августа 2011

У меня есть служба WCF, размещенная в службе Windows, которая публикует ошибки в любых подписанных приложениях монитора. Есть 2 серверных приложения, которые публикуют ошибки в службе, а затем эти ошибки отправляются любым подписанным приложениям монитора. Это делается с помощью WSDualHttpBinding.

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

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

http://msdn.microsoft.com/en-us/library/ms752254.aspx

У кого-нибудь есть идеи, что вызывает это?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Вы правы, что вам нужно увеличить время бездействия. Но когда вы используете надежные сеансы, receiveTimeout также учитывается. Из этого MSDN Статья :

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

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

Второй таймер неактивности находится на службе и использует Параметр ReceiveTimeout привязки. Этот таймер бездействия срабатывает, если в течение периода ожидания сообщения приложений не принимаются. это указывает, например, максимальное время, которое клиент может занять при отправке хотя бы одно сообщение на сервер, прежде чем сервер закроет канал, используемый сеансом. Такое поведение гарантирует, что клиенты не могут удерживать ресурсы сервера в течение произвольных длительных периодов.

Поскольку соединение прерывается, если срабатывает таймер неактивности, увеличение InactivityTimeout, когда оно больше, чем ReceiveTimeout не имеет никакого эффекта Значение по умолчанию для обоих этих тайм-аутов составляет 10 минут, так что вы всегда должны увеличить их оба, чтобы иметь значение, когда используя надежный сеанс.

Установка обоих этих значений на «Бесконечно» (если вы используете файлы конфигурации) или TimeSpan.MaxValue, если вы устанавливаете привязки в коде, должно достичь того, что вы ищете.

РЕДАКТИРОВАТЬ 1 Установка значений receiveTimeout и inactivityTimeout в «бесконечное» вызовет предупреждение в компиляторе. Это нормально. В среде IDE используется XSL, который не учитывает это ключевое слово. За кулисами WCF использует TimeSpanOrInfiniteConverter для преобразования ключевого слова в TimeSpan.MaxValue. Источник

0 голосов
/ 31 августа 2011

Я, кажется, исправил это, но все, что я сделал, это изменил привязку с WSDualHTTPBinding на NetTcpBindng. Теперь он работает 48 часов, тогда как раньше он не работал более часа.

...