Потеря состояния сеанса
У меня есть приложение ASP.net, в котором пользователи не могут успешно выполнить определенные действия, по причинам, которые я предполагаю, могут быть связаны только с потерей своей сессии (где я поддерживаю текущую информацию пользователя и как определить, вошли ли они в систему)
Я не понимаю, почему они потеряют сессию, поэтому мой первый вопрос:
Что (в общем) приведет к тому, что пользователь потеряет свою сессию в ASP.net?
и поскольку я не знаю, когда пользователь теряет сессию и сам не может ее воспроизвести:
Как я могу отслеживать, когда пользователь теряет сеанс
Ниже моя конфигурация sessionState для справки
<sessionState
mode="InProc"
cookieless="false"
cookieName="My.Site.Com"
timeout="480"/>
Ответы
Ответ 1
Несколько вещей могут привести к таинственным исчезновениям состояния сеанса.
- Истек ваш тайм-аут sessionState
- Вы обновляете свой web.config или другой тип файла, который заставляет ваш AppDomain перерабатывать
- Ваш AppPool в IIS перерабатывает
- Вы обновляете свой сайт с большим количеством файлов, а ASP.NET активно уничтожает ваш AppDomain для перекомпиляции и сохранения памяти.
-
Если вы используете IIS 7 или 7.5, вот несколько вещей, которые нужно искать:
- По умолчанию IIS заставляет AppPools отключиться после периода бездействия.
- По умолчанию IIS заставляет AppPools перерабатывать каждые 1740 минут (очевидно, в зависимости от вашей корневой конфигурации, но по умолчанию)
- В IIS ознакомьтесь с "Расширенными настройками" вашего AppPool. В нем есть свойство "Idle Time-out". Установите это значение в ноль или на большее число, чем значение по умолчанию (20).
- В IIS проверьте настройки "Утилизация" вашего AppPool. Здесь вы можете включить или отключить ваш AppPool от переработки. Вторая страница мастера - это способ входа в журнал событий каждого типа AppPool.
Если вы используете IIS 6, применяются те же самые настройки (по большей части, но с разными способами их получения), однако получение их для регистрации переработок больше связано с болью. Вот ссылка на способ заставить IIS 6 регистрировать события повторного использования AppPool:
http://web.archive.org/web/20100803114054/http://surrealization.com/sample-code/getnotifiedwhenapppoolrecycles/
-
Если вы обновляете файлы в своем веб-приложении, вы должны ожидать, что весь сеанс будет потерян. Это просто природа зверя. Однако вы не можете ожидать, что это произойдет несколько раз. Если вы обновляете 15 или более файлов (aspx, dll и т.д.), Существует вероятность того, что у вас будет несколько перезагрузок в течение определенного периода времени, поскольку эти страницы будут перекомпилированы пользователями, обращающимися к сайту. Смотрите эти две ссылки:
http://support.microsoft.com/kb/319947
http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.numrecompilesbeforeapprestart.aspx
Установка numCompilesBeforeAppRestart на большее число (или ручное отключение вашего AppPool) устранит эту проблему.
-
Вы всегда можете обращаться с Application_SessionStart и Application_SessionEnd, чтобы получать уведомления о том, когда сеанс создан или завершен. Класс HttpSessionState также имеет свойство IsNewSession, которое вы можете проверить на любом запросе страницы, чтобы определить, создан ли новый сеанс для активного пользователя.
-
Наконец, если это возможно в ваших обстоятельствах, я с успехом использовал режим сеанса SQL Server. Это не рекомендуется, если вы храните в нем большой объем данных (каждый запрос загружает и сохраняет полный объем данных с SQL Server), и это может быть больно, если вы помещаете в него пользовательские объекты (поскольку они должны быть сериализуемыми), но это помогло мне в сценарии совместного хостинга, где я не мог настроить свой AppPool, чтобы не перерабатывать пару часов. В моем случае я сохранил ограниченную информацию и не имел неблагоприятного эффекта. Добавьте к этому факт, что существующий пользователь будет повторно использовать свой SessionID по умолчанию, и мои пользователи никогда не замечали, что их сеанс в памяти был отключен с помощью утилиты AppPool, потому что все их состояние было сохранено в SQL Server.
Ответ 2
У меня была ситуация в ASP.NET 4.0, где мой сеанс будет reset для каждого запроса страницы (и мой код SESSION_START будет запускаться при каждом запросе страницы). Это не происходило с каждым пользователем для каждого сеанса, но обычно это происходило, и когда это произошло, это происходило при каждом запросе страницы.
Мой тег web.config sessionState имел тот же параметр, что и упомянутый выше.
cookieless="false"
Когда я изменил его на следующее...
cookieless="UseCookies"
... проблема, похоже, исчезла. По-видимому, true | false были старыми выборами из ASP.NET 1. Начиная с ASP.Net 2.0, перечисленные варианты стали доступными. Я предполагаю, что эти варианты устарели. Значение "ложное" никогда не представляло проблемы в прошлом - я заметил только на ASP.NET 4.0. Я не знаю, изменилось ли что-то в 4.0, которое больше не поддерживает его правильно.
Кроме того, я недавно узнал об этом. Поскольку проблема была прерывистой раньше, я полагаю, что я все еще могу столкнуться с ней, но пока она работает с этой новой настройкой.
Ответ 3
В моем случае настройки AppPool- > AdvancedSettings- > Максимальные рабочие успехи на 1 помогли.
Ответ 4
Ваша сессия потеряна....
Я нашел сценарий, в котором сеанс потерян. На странице asp.net для поля текстового поля количества есть недопустимые символы, а за ним следует поиск с помощью переменной сеанса для других целей. После публикации недействительного синтаксического анализа чисел через Convert. ToInt32 или double вызывает исключение для первого шанса, но ошибка не отображается в этой строке. Вместо этого Session, являющееся null из-за необработанного исключения, показывает ошибку при извлечении сеанса, тем самым обманывая отладку...
СОВЕТ: проверьте свою систему на неудачу. DESTRUCTIVE.. введите достаточно мусор в несвязанных сценариях для ex: после показа результатов поиска введите мусор в критерии поиска и детали получения результатов поиска..., вы сможете воспроизвести это машина на вашей локальной базе кода тоже...:)
Надеюсь, что это поможет, гитечие
Ответ 5
Вы можете добавить некоторые записи в Global.asax в Session_Start и Application_Start, чтобы отслеживать, что происходит с сеансом пользователя и приложением в целом.
Кроме того, следите, чтобы вы работали в режиме веб-фермы (несколько потоков IIS, определенных в пуле приложений) или балансировку нагрузки, поскольку пользователь может попасть на другой сервер, у которого нет той же памяти. Если это так, вы можете переключить режим сеанса на SQL Server.
Ответ 6
Я потерял сессию, которая не была ни строкой, ни целым числом, а датароу.
Помещение данных в сериализуемый объект и сохранение этого в сеансе работало для меня.
Ответ 7
При загрузке содержимого через Ajax возникла проблема с IIS 8. Проблема заключалась в том, что MaximumWorkerProcesses
был установлен в 2
, а Javascript открыл 17 одновременных запросов. Это было больше, чем AppPool мог обрабатывать, и был открыт новый пул (без auth-data).
Решение заключалось в изменении MaximumWorkerProcesses
на 0
в IIS -> Server -> Application Pools -> [myPool] -> Advanced Settings -> Process Model -> MaximumWorkerProcesses
.
Ответ 8
Не знаю, связано ли это с вашей проблемой или нет, но Windows 2008 Server R2 или SP2 изменили свои настройки IIS, что приводит к проблеме в сохранении сеанса. По умолчанию он управляет отдельной переменной сеанса для HTTP и HTTPS. Когда переменные установлены в HTTPS, они будут доступны только на страницах HTTPS при переключении.
Для решения проблемы есть настройка IIS. В диспетчере IIS откройте свойства ASP, разверните Свойства сеанса и измените Новый идентификатор для безопасного соединения на Ложный.