Потеря переменных сеанса. Какое исключение может привести к потере сеансов? - PullRequest
2 голосов
/ 01 октября 2010

У меня включен мониторинг работоспособности в производственной системе (asp.net webforms .net 4), и я вижу, что мне отправляется множество ошибок, указывающих, что переменная сеанса была потеряна.

(Я пытаюсь присоединить что-то из состояния сеанса к контексту данных структуры сущности и получаю ошибку «Значение не может быть пустым, сущность имени параметра»).Таким образом, переменная сеанса теперь содержит нуль, а не объект.

Интересно, что одно и то же приложение развернуто на двух отдельных серверах - один DMZ-сервер для внешних пользователей и один внутренний сервер для внутренних пользователей.Оба этих приложения на двух разных серверах, похоже, имеют одну и ту же проблему.

Мониторинг работоспособности также отслеживает события времени жизни, и из этого я вижу, что у нас нет чего-то вроде рециркуляции IIS, изменений конфигурации, изменений в binпапки, перекомпиляции и т.д., происходящие.

Я прочитал эту страницу: http://weblogs.asp.net/bleroy/archive/2004/08/03/Don_2700_t-redirect-after-setting-a-Session-variable-_2800_or-do-it-right_2900_.aspx

Я могу подтвердить, что это не проблема Response.Redirect, потому что это не происходит - это онлайн-приложениеform - он переводит объект в состояние сеанса на page_load, и появляется многовариантность - когда нажимается «next», объект выходит из состояния сеанса, присоединяется к контексту данных, вносятся изменения из веб-формы и обновляется текст данных.Так что отклика response.redirect не происходит.

Я также могу подтвердить, что подробности в «Обновлении 1» и «Обновлении 2» по этой ссылке мне не нужны - в пуле приложений работает только 1 рабочий процессимя сервера или веб-адрес не содержат символов подчеркивания.

Я также рассмотрел возможность возникновения тайм-аутов сеанса, но они должны обрабатываться другим кодом, который выполняется для обнаружения тайм-аутов сеанса (см .: http://blogs.msdn.com/b/nikhiln/archive/2007/06/21/detecting-session-timeout-in-asp-net-2-0-web-applications.aspx), который я проверял снова и снова - Часть проблемы в том, что я просто не могу воспроизвести эту ошибку самостоятельно.

Итак: -
- Нет тайм-аутов
- Не переработка рабочего процесса IIS или какие-либо другиедругая вещь, которая генерировала бы событие жизненного цикла мониторинга работоспособности
- не использовать response.redirect
- не получена веб-ферма / несколько рабочих процессов

Затем я нашел эту ветку: http://bytes.com/topic/asp-net/answers/490975-disappearing-sessionsгде MVP сказал следующее:

Каждый раз, когда приложение IIS перезапускается, все сеансы также перезапускаются.Так что да, это обычно происходит во время перекомпиляции и некоторых основных необработанных исключений на уровне приложений.

Но, к сожалению, не уточнил, к какому типу могут привести «основные необработанные исключения на уровне приложений»к потере сеанса - это совершенно новая система, и у нас все еще есть необработанные исключения, над которыми мы работаем над исправлением - так о каких исключениях мы говорим здесь?Может ли исключение приложения в сеансе одного человека действительно удалить все сеансы, удерживаемые приложением?

Этот поток также затрагивает его: http://bytes.com/topic/asp-net/answers/490975-disappearing-sessions

Единственное, что я видел подобноеэто когда во время выполнения приложения ASP.NET возникает ошибка, приводящая к перезапуску приложения.Вы тоже получаете события Application_OnStart?

Итак, я предполагаю, что если бы у меня была ошибка времени выполнения, которая вызвала перезапуск приложения, это также вызвало бы событие жизненного цикла мониторинга работоспособности, верно?И я просто не получаю ничего из этого ...

Было бы намного проще, если бы я мог на самом деле повторить это, но я просто не могу!

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

С уважением

1 Ответ

1 голос
/ 01 октября 2010

Рассматривали ли вы размещение состояния сеанса вне приложения, например, с любым из asp.net внепроцессных режимов для состояния сеанса ?

По умолчанию состояние сеанса сохраняетсявнутри вашего приложения.Он недоступен на нескольких серверах и не поддерживается при сбоях приложений (т. Е. Любых необработанных исключениях в вашем приложении.)

  1. Используйте режим SQL Server, чтобы сделать одно и то же состояние сеанса доступным для всехнесколько серверов.

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

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