C# 为什么在会话结束事件期间HttpContext.Current为空?
我想计算我的用户数,下面是我的dll文件中的代码: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
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)访问该会话。