您好
在我的网络应用程序用户正常登录网站,他们已在数据库中的用户表中标记为Session_End中的在线用户我想将其注销
在Session_End中,我无权访问HttpContext.Current.Session或Session
它们都是null,如何在(Session_End)事件中访问会话变量。
答案 0 :(得分:3)
如果您正在使用InProc会话(因此会触发Session_End事件),您可以使用
this.Session
当你使用global.Asax时,Global.asax本身扩展了HttpApplication
来自MSDN(http://msdn.microsoft.com/pt-br/library/system.web.httpapplication.aspx):
“此类是由...定义的应用程序的基类 用户在Global.asax文件中。“
我在Global.asax中创建了一个返回Session的方法:
public HttpSessionState GetSession()
{
//Check if current context exists
if (HttpContext.Current != null)
{
return HttpContext.Current.Session;
}
else
{
return this.Session;
}
}
所以我可以使用以下方法@ global.asax:
var x = GetSession()["key"];
修改强>
但是,可以生成多个应用程序实例来处理请求(您可以在
中设置所需的工作进程数) IIS > App Pools > Properties
但是对于不同的工作进程,请求可能会落在许多工作进程中的一个上,而这些进程没有您想要的会话信息
请参阅ASP.NET session state and multiple worker processes
我建议存储第一次访问和最后一次注册访问(Post_Authenticate event)。
此外,使用定期运行的SQL Server作业来检查上次访问。这样您就可以防止应用程序崩溃(当Session_End事件不会触发时)。
答案 1 :(得分:1)
Session_End仅在您使用InProc会话管理时才有效。也许您正在使用StateServer或SqlServer方法?