Некоторые вещи могут привести к таинственному исчезновению состояния сеанса.
- Ваш тайм-аут сессииState истек
- Вы обновляете свой файл web.config или другой тип файла, который приводит к перезагрузке вашего домена приложений
- Ваш AppPool в IIS перезагружается
- Вы обновляете свой сайт большим количеством файлов, а ASP.NET активно разрушает ваш домен приложений для перекомпиляции и сохранения памяти.
-
Если вы используете IIS 7 или 7.5, вот несколько вещей, которые нужно искать:
- По умолчанию IIS устанавливает AppPools на отключение после определенного периода бездействия.
- По умолчанию IIS устанавливает перезапуск AppPools каждые 1740 минут (очевидно, в зависимости от вашей корневой конфигурации, но это по умолчанию)
- В IIS проверьте «Расширенные настройки» вашего AppPool. В нем есть свойство под названием «Idle Time-out». Установите его на ноль или на большее число, чем значение по умолчанию (20).
- В IIS проверьте настройки «Переработка» вашего AppPool. Здесь вы можете включить или отключить AppPool от переработки. 2-я страница мастера - это способ регистрации в журнале событий каждого типа отключенного 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.