Подтвердить что ты не робот

Потеря состояния сеанса

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

Я не понимаю, почему они потеряют сессию, поэтому мой первый вопрос:

Что (в общем) приведет к тому, что пользователь потеряет свою сессию в ASP.net?

и поскольку я не знаю, когда пользователь теряет сессию и сам не может ее воспроизвести:

Как я могу отслеживать, когда пользователь теряет сеанс

Ниже моя конфигурация sessionState для справки

<sessionState
           mode="InProc"
           cookieless="false"
           cookieName="My.Site.Com"
           timeout="480"/>
4b9b3361

Ответ 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, разверните Свойства сеанса и измените Новый идентификатор для безопасного соединения на Ложный.