C# 为什么在会话结束事件期间HttpContext.Current为空?

C# 为什么在会话结束事件期间HttpContext.Current为空?,c#,asp.net,session,login,C#,Asp.net,Session,Login,我想计算我的用户数,下面是我的dll文件中的代码: public static class UserCount { public static void add() { HttpContext.Current.Application.Lock(); int count = (int) HttpContext.Current.Application["CountOfUsers"]; count++; HttpConte

我想计算我的用户数,下面是我的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();
    }

为什么
HttpContext。当前
subtract
方法中的
null导致它抛出异常?

在会话结束时,浏览器不一定涉及通信,因此没有HttpContext可参考,这解释了它为什么为null

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

如果您在UserCount类上创建了一个重载,并且该重载采用了

public static void subtract(HttpApplicationState appstate)
{
    appstate.Lock();
    int count = (int) appstate["CountOfUsers"];
    count--;
    appstate["CountOfUsers"]=count;
    appstate.UnLock();
}
您可以从会话结束时这样使用它:

protected void Session_End(object sender, EventArgs e)
{
    UserCount.subtract(Application);
}
这是因为global_asax在技术上是的一个子类,因此它的所有成员都可以从global_asax文件中访问


当存在HttpContext时,可以使用
substract
的另一个实现。

在会话结束时,浏览器不需要进行通信,因此没有HttpContext可供参考,这解释了它为空的原因

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

如果您在UserCount类上创建了一个重载,并且该重载采用了

public static void subtract(HttpApplicationState appstate)
{
    appstate.Lock();
    int count = (int) appstate["CountOfUsers"];
    count--;
    appstate["CountOfUsers"]=count;
    appstate.UnLock();
}
您可以从会话结束时这样使用它:

protected void Session_End(object sender, EventArgs e)
{
    UserCount.subtract(Application);
}
这是因为global_asax在技术上是的一个子类,因此它的所有成员都可以从global_asax文件中访问


当存在HttpContext时,可以使用
substract
的另一个实现。

请尝试使问题更清楚,包括检查拼写。
global.asax
session\u end
@AndersAbel修复了它,还有其他问题吗?请尝试使问题更清楚,包括检查拼写。
global.asax
session\u end
@AndersAbel修复了它,还剩下什么吗?我花了一些时间来确认这一点,但我相信你是正确的<代码>HttpContext。当前的
依赖于执行上下文,当
会话结束
触发时,执行上下文不同或缺失。应用程序状态仍然可用(在内部,它只是一个静态成员);诀窍是按照你所展示的那样去做。有趣的是,我相信OP的代码可以在IIS6中工作;我记得几年前做过类似的事情,没有问题。是的,但是。。。如果会话_End正在启动,您不应该访问正在结束的会话吗?要清理即将结束的会话。。。在会话结束事件中?@Triynko是的,您可以通过。OP的问题是,他们试图通过HttpContext.Current访问该会话,HttpContext.Current可以为空。我们花了一些时间来确认这一点,但我相信您是正确的<代码>HttpContext。当前的
依赖于执行上下文,当
会话结束
触发时,执行上下文不同或缺失。应用程序状态仍然可用(在内部,它只是一个静态成员);诀窍是按照你所展示的那样去做。有趣的是,我相信OP的代码可以在IIS6中工作;我记得几年前做过类似的事情,没有问题。是的,但是。。。如果会话_End正在启动,您不应该访问正在结束的会话吗?要清理即将结束的会话。。。在会话结束事件中?@Triynko是的,您可以通过。OP的问题是,他们试图通过HttpContext.Current(可以为null)访问该会话。