为什么在Global.asax中HttpContext.Current.Session为空?

17

我正在使用VS2010创建一个简单的asp.web forms应用程序,并使用Development Server来测试它。
我尝试将从sql server查询的用户数据存储在会话中,因为我不想在每个请求中访问数据库。我正在使用'Application_AuthenticateRequest'和'Session_Start'方法。
第一轮:
调用AuthenticateRequest。以下代码已运行:

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变量是通过静态属性发布的私有静态字段。 在第一轮中,Session为null,我认为这是可以的,因为还没有调用Session_Start。 Session_Start的代码如下:

protected void Session_Start(object sender, EventArgs e)
{
  Session["EMPLOYEE_DATA"] = EmployeeFactory.Current;
}
在下一轮中,当然不会调用Session_Start,但在AuthenticateRequest中我无法访问会话。HttpContext.Current.Session为空,而this.Session引用抛出HttpException,说“此上下文中不可用会话状态”。
然而,我可以从任何一个page_load事件中访问会话,但我认为这是一个不好的做法,因为在每个page_load中都放置验证。
有什么想法如何访问会话?
感谢建议, Péter
2个回答

38

您无法在Application_AuthenticateRequest上使用Session,因为此时它尚未绑定。

我认为您可以在Application_AcquireRequestState事件上使用它。


谢谢。这就是解决方案。 - Péter
2
@Torbjörn Hansson:有时它是null,你知道为什么吗? - Homam
希望我能给这个点赞一千次!那个简单的改变刚刚结束了数小时的痛苦。 - Matt Cashatt
4
我认为有必要应用以下测试: if (System.Web.HttpContext.Current.Session != null) 因为Application_AcquireRequestState可能会被调用多次,并且在某些情况下会话可能为空。这是我的做法,我从这里得到的: https://dev59.com/zWkw5IYBdhLWcg3wbqAS - Daniel Katz

-2
尝试在 page_Load 中使用下面的代码。
Response.AppendHeader("Refresh", Convert.ToString(Session.Timeout * 15) + "; 
URL=SessionExpPage.aspx");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接