У меня следующая проблема: повторная публикация веб-приложения ASP.NET вызывает (как и ожидалось) сброс сеанса, где я храню дополнительную информацию о пользователе (что при попытке доступа вызовет исключение NullReferenceException).
Но иногда этоне помогает
Я не уверен, что вы подразумеваете под «иногда это не помогает» - вы не говорите, что именно происходит.
Но вы должны помнитьчто истечение срока действия билета проверки подлинности с помощью форм и истечение времени ожидания сеанса полностью независимы.Сеанс пользователя может быть приостановлен, пока его билет проверки подлинности с помощью форм еще действителен, и наоборот.
В общем, при доступе к данным из сеанса вы всегда должны сначала проверять существование и обновлять его при необходимости:
object o = Session["Whatever"];
if (o == null)
{
o = ... refresh it e.g. from the database
Session["Whatever"] = o;
}
...
Часто полезно использовать вспомогательный класс для инкапсуляции этого.
В вашем случае вы ссылаетесь на "дополнительную информацию о пользователе" - так что вы, вероятно, сможете получить ее, используя HttpContext.Current.User.Identity.Name
какключ.
Заставить пользователя снова войти в систему из-за истечения сеанса, например, из-за перезапуска пула приложений на сервере, очень недружелюбно.
ОБНОВЛЕНИЕ
В документации MSDN для RedirectToLoginPage указано, что:
В отличие от метода HttpResponse.Redirect, этот метод не завершает запрос, вызывая HttpResponse.End.Это означает, что будет выполняться код, следующий за вызовом метода RedirectToLoginPage.
Это, вероятно, объясняет то, что вы видите: код в жизненном цикле страницы после выполнения вызова RedirectToLoginPage
и бросокNullReferenceException
.
Вы можете позвонить Response.End
после RedirectToLoginPage
, чтобы избежать этого.
Тайм-аут моего сеанса установлен = Тайм-аут авторизации форм (через web.config).
Я бы еще раз повторил, что истечение срока действия сеанса и истечения срока действия FormsAuthentication не связаны, даже если тайм-ауты оказываются одинаковыми.Файл cookie FormsAuthentication выдержит перезапуск пула приложений на сервере;сеанса не будет.