Когда вы используете режим состояния сеанса по умолчанию «InProc» (в процессе), как и вы, данные состояния сеанса очень хрупки и теряются при повторном запуске AppPool.
Подумайте об использовании других встроенных режимов состояния сеанса, которые работают вне процесса и поэтому не подвержены повторному использованию AppPool. Это режим «StateServer» (выполняется в памяти в отдельном процессе) и режим «SqlServer» (данные о состоянии, хранящиеся в БД SQL Server).
Вы захотите использовать один из этих режимов состояния сеанса вне процесса, чтобы повысить надежность данных сеанса, особенно если вам требуется более длительное время ожидания сеанса. Это не отвечает на ваш вопрос о том, почему время вашего сеанса преждевременно истекло, но это будет частью решения.
Различные режимы состояния сеанса имеют свои сильные и слабые стороны с точки зрения надежности, требований к памяти, масштабируемости и производительности, поэтому вам необходимо ознакомиться с ними, чтобы определить правильный выбор для вашего приложения.
В качестве дополнительного примечания всегда учитывайте, нужно ли вообще передавать ваши данные в сеанс. Как правило, лучше использовать ViewState, когда требуются данные между постбэками на одной странице, если объем данных не слишком велик. Вполне возможно разрабатывать приложения ASP.NET, которые вообще не используют Session, или используют его очень редко, и, как правило, я нахожу вещи более интуитивно понятными, когда вы не используете Session, например. кнопка Назад браузера. Ваша БД существует для сохранения ваших данных, поэтому не стесняйтесь ее использовать. Если вы передаете таблицы или наборы данных между страницами, используя Session, подумайте, действительно ли вам это нужно. Не могли бы вы передать параметры через строку запроса, а затем использовать параметры для извлечения данных из вашей БД при запросе страницы?
См .: Режимы состояния сеанса MSDN