Application_End global.asax 中的注销用户

Application_End Logout Users in global.asax

提问人:Mussaib Siddiqui 提问时间:9/2/2016 最后编辑:CommunityMussaib Siddiqui 更新时间:9/2/2016 访问量:1398

问:

我想问一下我可以在Application_End???中注销用户吗 ,我知道Application_End何时调用Application_End global.asax

但我只想知道让所有用户在应用程序端注销是否正确,我只想输入用户的注销日期时间。

    void Application_End(object sender, EventArgs e)
    {
        try
        {
            var LisLoginUsers = db.USER_LOGIN.Where(z => z.LOGOUT_DATETIME == null).ToList();
            if (LisLoginUsers.Count != 0)
            {
                for (int i = 0; i < LisLoginUsers.Count; i++)
                {
                    LisLoginUsers[i].LOGOUT_DATETIME = System.DateTime.Now;
                    db.SaveChanges();

                }
            }
        }
        catch (Exception msg)
        {
            ExceptionLogging.SendErrorToText(msg);
            Response.Redirect("/Account/Error/");

        }
    }
C# ASP.NET-MVC 全局 ASAX

评论


答:

0赞 Alexei Levenkov 9/2/2016 #1

不可以,您不能使用 Application_End 在真实站点中录制单曲。

由于Application_End事件不与任何请求绑定,因此有些事情您不能做 - 您不能对特定用户执行操作或将响应重定向到某个地方(因为没有请求/响应开始)。

确实,您可以清除或批量更新数据库中的信息,但无法实现“输入用户注销日期时间”的实际目标。

应用程序关闭与任何用户行为无关 - 它仅与出于任何原因(即由于更新或不活动而重新启动站点)停止服务器端代码有关。从用户的角度来看,他们可能仍然在查看页面并认为自己“已登录”。

如果您有一个具有多个服务器的重要站点,则当每个服务器重新启动 IIS 进程时也没有相关性,因此完全不适合“用户注销”,因为一台服务器可以在其他服务器重新启动时主动处理请求。Application_End

最好的办法是显式(即登录后 40 分钟)或通过更新每个请求的时间/页面中的检测信号 AJAX ping 来超时用户会话。