【问题标题】:Why is HttpContext.Current null during the Session_End event?为什么 Session_End 事件期间 HttpContext.Current 为空?
【发布时间】:2015-02-23 19:17:30
【问题描述】:

我想统计我的用户,这是我的 dll 文件中的以下代码:

public static class UserCount
{
    public static void add()
    {
        HttpContext.Current.Application.Lock();
        int count = (int) HttpContext.Current.Application["CountOfUsers"];
        count++;
        HttpContext.Current.Application["CountOfUsers"]=count;
        HttpContext.Current.Application.UnLock();
    }

    public static void subtract()
    {   
        HttpContext.Current.Application.Lock();//error : HttpContext.Current is null. why?
        int count = (int) HttpContext.Current.Application["CountOfUsers"];
        count--;
        HttpContext.Current.Application["CountOfUsers"]=count;
        HttpContext.Current.Application.UnLock();
    }
}

我已设置Session.TimeOut=1; 一分钟后 Global.asax 文件中的以下方法将运行:

    protected void Session_End(object sender, EventArgs e)
    {
        UserCount.subtract();
    }

为什么subtract 方法中的HttpContext.Current null 会导致它抛出异常?

【问题讨论】:

  • 请尽量让问题更清楚,包括检查拼写。
  • global.asax, session_end
  • @AndersAbel 修复了它,还有什么剩下的吗?

标签: c# asp.net session login


【解决方案1】:

在 Session_End 上,浏览器没有必然涉及的通信,因此没有 HttpContext 可以参考,这解释了为什么它为空。

查看您的代码,您似乎对应用程序缓存感兴趣。这可以通过 HttpApplication 实例上的 Application 属性获得。

如果您在 UserCount 类上创建一个采用 HttpApplicationState 的重载,您会没事的:

public static void subtract(HttpApplicationState appstate)
{
    appstate.Lock();
    int count = (int) appstate["CountOfUsers"];
    count--;
    appstate["CountOfUsers"]=count;
    appstate.UnLock();
}

您可以像这样从 Session_End 使用它:

protected void Session_End(object sender, EventArgs e)
{
    UserCount.subtract(Application);
}

这是可行的,因为 global_asax 在技术上是 HttpApplication 的子类,因此它的所有成员都可以从 global_asax 文件中访问。

substract的其他实现可以在有HttpContext的情况下使用。

【讨论】:

  • 花了一点时间来确认这一点,但我相信你是正确的。 HttpContext.Current 取决于执行上下文,当Session_End 触发时,执行上下文会有所不同或缺失。应用程序状态仍然可用(在内部它只是一个静态成员);诀窍是按照您的说明进行操作。有趣的是,我相信 OP 的代码可以在 IIS 6 中运行;我记得几年前做过类似的事情,没有问题。
  • 是的,但是...如果 Session_End 正在触发,您是否应该有权访问即将结束的会话?在会话结束事件中清理正在结束的会话...?
  • @Triynko 是的,您可以通过HttpApplication.Session。 OP 的问题是他们试图通过可以为 null 的 HttpContext.Current 访问该 Session。
猜你喜欢
  • 1970-01-01
  • 2013-10-30
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多