Переменная сеанса теряется?

Учитывая этот Global.asax.cs:

using System;
using System.Web;

namespace Foo.Web {
    public class Global : HttpApplication {
        private const string IntroductionPageShownSessionKey = "IntroductionPageShownSessionKey";

        protected void Application_AcquireRequestState(object sender, EventArgs e) {
            ShowIntroductionIfNotYetShown();
        }

        private void ShowIntroductionIfNotYetShown() {
            if (HttpContext.Current.Session != null) {
                var introductionPageShown = Convert.ToBoolean(Session[IntroductionPageShownSessionKey]);
                if (!introductionPageShown) {
                    if (Request.Path.EndsWith("/Introduction.aspx")) {
                        Session[IntroductionPageShownSessionKey] = true;
                    }
                    else {
                        Response.Redirect("~/Introduction.aspx" + Request.Url.Query);
                    }
                }
            }
        }
    }
}
  1. Пользователь открывает веб-приложение и показывает Introduction.aspx
  2. Пользователь продолжает использовать веб-приложение в течение нескольких минут (ASP.NET_SessionId: ublbhu45ji31e055ywqu0555).
  3. Пользователь бездействует (не выполняет никаких обратных передач) на несколько минут.
  4. Пользователь выполняет обратную передачу
  5. Пользователю отображается Introduction.aspx
  6. Вторая проверка пользовательского файла cookie ASP.NET_SessionId по-прежнему показывает ublbhu45ji31e055ywqu0555.

Почему пользователю отображается Introduction.apsx во второй раз в рамках одного и того же сеанса ASP.NET? Я знаком с риском установки переменных сеанса непосредственно перед редирект в том же постбэке, но здесь это не применимо, верно?


person lance    schedule 22.09.2010    source источник
comment
как долго это несколько минут? достаточно долго, чтобы истечь время сеанса?   -  person Sander Rijken    schedule 22.09.2010
comment
Чтобы ответить на ваш вопрос: Нет. Мое намерение с включением идентификаторов сеанса состояло в том, чтобы доказать, что сеанс никогда не истекает. Насколько я понимаю, в этом сценарии мы имеем дело только с одним сеансом.   -  person lance    schedule 22.09.2010
comment
Значение файла cookie идентификатора сеанса на самом деле напрямую не связано со временем жизни сеанса; то есть время сеанса может истечь, даже если значение cookie все еще действительно, отправлено и принято. Первое, что я бы сделал, это проверил значение времени ожидания для сеанса, а также убедился, что AppDomain не перезапускается.   -  person Andrew Barber    schedule 22.09.2010
comment
У меня было это на нескольких Dev. веб-сайты, над которыми я работал. Сеанс в web.config был установлен на 20 минут, но из-за настроек IIS сеанс истечет, если вы бездействуете в течение 5 минут. Кроме того, есть еще случай с новым разработчиком, только что окончившим школу, который очищает все переменные в конце своих функций... включая сеансы. Это весело.   -  person Ryan Ternier    schedule 22.09.2010
comment
@Ryan Ternier: Единственный известный мне способ, помимо web.config, установить тайм-аут ASP.NET — это инструмент веб-конфигурации ASP.NET (который затем обновляет ваш web.config). Насколько я понимаю, графический интерфейс IIS обновляет не тайм-аут сеанса ASP.NET, а только тайм-аут устаревшего сеанса ASP? Какие параметры IIS вы бы порекомендовали проверить на время ожидания сеанса ASP.NET?   -  person lance    schedule 22.09.2010
comment
Фактически, файл cookie HTTP является файлом cookie сеанса, когда дата истечения срока действия не установлена ​​(тогда срок действия — это время, в течение которого браузер остается открытым). Когда установлена ​​дата истечения срока действия, файл cookie называется постоянным.   -  person Sander Rijken    schedule 22.09.2010
comment
@Эндрю Барбер: Вы, сэр, победили. Мой AppDomain закрывается (доказано с помощью stackoverflow.com /questions/294113/iis-recycle-global-asax/). Я буду кредитовать ответ, который вы создаете. Спасибо.   -  person lance    schedule 22.09.2010
comment
@Lance проверьте forums.asp.net/t/1283350.aspx   -  person Ryan Ternier    schedule 22.09.2010
comment
@Ryan Ternier: я вижу там графический интерфейс IIS для установки продолжительности простоя рабочего процесса (который убивает сеансы только в том случае, если они находятся в процессе, верно?), но нет графического интерфейса IIS для установки тайм-аутов сеанса ASP.NET? Я что-то упускаю? Я не вижу графического интерфейса IIS для установки времени ожидания сеанса ASP.NET.   -  person lance    schedule 22.09.2010


Ответы (1)


Имейте в виду, что сам сеанс, вероятно, имеет более короткое время жизни, чем файл cookie сеанса, отправляемый в браузер, и значение идентификатора, установленное в этом файле cookie. На самом деле браузер может продолжать отправлять старый идентификатор сессии, а сервер примет его и создаст из него новую сессию, если срок действия старого истек.

Последствия заключаются в двух возможностях: 1) время ожидания сеанса истекает из-за значения конфигурации времени ожидания (я не знаю, что происходит в вашем конкретном случае)

2) Что мы выяснили в вашем случае с помощью комментариев к этому вопросу: AppDomain закрывался или перерабатывался.

person Andrew Barber    schedule 22.09.2010