在Session_End中访问会话变量

时间:2010-10-14 12:21:15

标签: c# .net asp.net

您好
在我的网络应用程序用户正常登录网站,他们已在数据库中的用户表中标记为Session_End中的在线用户我想将其注销 在Session_End中,我无权访问HttpContext.Current.Session或Session 它们都是null,如何在(Session_End)事件中访问会话变量。

2 个答案:

答案 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方法?