为什么在Session_End事件期间HttpContext.Current为null?

时间:2014-12-26 13:25:03

标签: 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++;
        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.Current方法中subtract为空,导致它抛出异常?

1 个答案:

答案 0 :(得分:4)

在Session_End上,浏览器不一定涉及通信,所以没有HttpContext可以引用它解释为什么它是null。

查看您的代码,您似乎对应用程序缓存感兴趣。这可以通过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文件访问其所有成员。

当存在HttpContext时,可以使用substract的其他实现。