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