我想计算我的用户,这是我的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
为空,导致它抛出异常?
答案 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
的其他实现。