繁体   English   中英

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

[英]Why is HttpContext.Current null during the Session_End event?

我想计算我的用户,这是我的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导致它引发异常?

在Session_End上,浏览器不必进行任何通信,因此没有HttpContext可以引用,它解释了为什么它为null。

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

如果您在使用HttpApplicationState的 UserCount类上创建重载,则可以:

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的其他实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM