Почему HttpContext.Current.Session имеет значение null в Global.asax?

Я использую VS2010 и создал простой asp. приложение веб-форм, используя сервер разработки для его проверки.
Я пытаюсь сохранить пользовательские данные - запрашиваемые с сервера sql - в сеансе, так как я не хочу получать доступ к базе данных в каждом запросе. Я использую методы "Application_AuthenticateRequest" и "Session_Start".
Первый раунд: Вызывается аутентификацияRequest. Произошел следующий код:

public static void Initialize(string login_name, bool force_refresh)
    {
      HttpSessionState Session = HttpContext.Current.Session;
      object o = Session == null ? null : Session["EMPLOYEE_DATA"];
      if (force_refresh || o == null || o.GetType() != typeof(Employee) || (o as Employee).login_name!= login_name)
      {
        _current = UIManager.GetEmployee(login_name);
        if (Session != null)
        {
          Session["EMPLOYEE_DATA"] = _current;
        }
      }
      else
      {
        _current = (Employee)o;
      }
    }

Переменная _current является частным статическим полем, опубликованным через статическое свойство. В первом раунде сеанс имеет значение null, и я думаю, что это нормально, потому что Session_Start еще не вызван. Session_Start выглядит следующим образом:

protected void Session_Start(object sender, EventArgs e)
{
  Session["EMPLOYEE_DATA"] = EmployeeFactory.Current;
}

В следующем раунде Session_Start не вызывается, конечно, но в AuthenticateRequest я не могу получить доступ к сеансу. HttpContext.Current.Session имеет значение null и this.Session ссылается на HttpException говорит, что "состояние сеанса недоступно в этом контексте".

Однако я могу получить доступ к сеансу из любого из событий page_load, но это плохая практика, я думаю, что ставил аутентификацию на каждый page_load. Любая идея, как я могу получить доступ к сеансу?

Спасибо за совет,
Петер

Ответы

Ответ 1

Вы не можете использовать Session в Application_AuthenticateRequest, потому что он не связан в этот момент.

Я думаю, что вы можете использовать событие Application_AcquireRequestState.

Ответ 2

попробуйте использовать приведенный ниже код в page_Load

Response.AppendHeader("Refresh", Convert.ToString(Session.Timeout * 15) + "; 
URL=SessionExpPage.aspx");