【问题标题】:Why HttpContext.Current.Session is null in Global.asax?为什么 HttpContext.Current.Session 在 Global.asax 中为空?
【发布时间】:2010-11-15 15:26:47
【问题描述】:

我正在使用 VS2010 并创建了一个简单的 asp。 Web 表单应用程序,使用开发服务器对其进行测试。
我尝试在会话中存储从 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 为空,我认为没关系,因为 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 事件访问 Session,但这是一种不好的做法,我认为我在每个 page_load 都进行身份验证。 知道如何访问会话吗?

感谢您的建议,
彼得

【问题讨论】:

    标签: asp.net session-variables global-asax


    【解决方案1】:

    您无法在 Application_AuthenticateRequest 上使用 Session,因为此时它没有被绑定。

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

    【讨论】:

    • 谢谢。这就是解决方案。
    • @Torbjörn Hansson:有时它是空的,你知道为什么吗?
    • 希望我能投票一千次!这个简单的改变刚刚结束了数小时的痛苦。
    • 我认为有必要应用此测试: if (System.Web.HttpContext.Current.Session != null) 因为 Application_AcquireRequestState 可以多次调用,并且会话在某些情况下可以为 null .这就是它对我的工作方式,我从这里得到:stackoverflow.com/questions/9897112/…
    【解决方案2】:

    尝试在 page_Load 中使用以下代码

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2014-03-28
      相关资源
      最近更新 更多