Сессии и серверные переменные в Session_End - PullRequest
2 голосов
/ 13 января 2011

У меня есть сайт сессии InProc со следующей реализацией:

protected void Session_End(object sender, EventArgs e)
        {
            StreamWriter sw = null;
            string logFile = Server.MapPath("testSessionLog.txt");
            sw = new StreamWriter(logFile, true);
            sw.WriteLine("Session_End called at " + DateTime.Now);
            try
            {
                //Request is not available in this context 
                if (Request.ServerVariables["Logon_User"] != null && Request.ServerVariables["Logon_User"] != "")
                {
                    sw.WriteLine("Made it past Request.ServerVariables check");
                }
            }
            catch (Exception ex)
            {
                sw.Write("An error occured: " + ex.Message);
            }
            finally
            {
                sw.Close();
            }         
        }

Я прочитал пару статей ( 1 , 2 ) в стеке, в которых подробно описывается использование this.Session, чтобы добраться до HttpSessionState. Как насчет Server.MapPath () и Request.ServerVariables ()? Я не могу заставить их работать в Session_End либо.

Я вставил этот же кусок кода в событие button_Click, и оно работает без проблем. Это заставляет меня поверить, что это что-то связанное с Session_End.

Я настроил IIS6 на повторный цикл один раз в минуту. Когда у меня открытая сессия, она взрывается с: Ошибка:
Тип исключения: HttpException
Сообщение об исключении: работа сервера недоступна в этом контексте

В средстве просмотра событий оно отображается как событие 1309. Он жалуется на строку, содержащую Server.MapPath ()

Ответы [ 3 ]

4 голосов
/ 13 января 2011

Как уже упоминалось, нет объекта HttpContext для работы при вызове Session_End, поэтому доступ к ie. ServerVariables не имеет никакого смысла вообще.

Для MapPath вы можете вызвать статический метод HostingEnvironment.MapPath(), который не зависит от наличия в запросе.

http://msdn.microsoft.com/en-us/library/system.web.hosting.hostingenvironment.mappath.aspx

2 голосов
/ 13 января 2011

Проблема в том, что session_end не запускается из запроса.оно срабатывает по истечении времени ожидания на сервере, задолго до того, как был обработан последний запрос на сеанс.Таким образом, объект запроса не будет иметься.

Это может быть неверно, если вы вызвали Abandon в сеансе (поскольку вы сделали это в контексте запроса).Я не пробовал это, но я подозреваю, что это тоже не сработает.

Я не знаю о MapPath - возможно, для выполнения этого требуется живой запрос.

0 голосов
/ 13 января 2011

В конце концов, к Запросу и Серверу можно добраться.Вы должны использовать HttpContext.Current.Request и HttpContext.Current.Server соответственно.Не сессия.Есть довольно хорошее сравнение двух в стеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...