Application_End 注销 global.asax 中的用户

Application_End Logout Users in global.asax

我想问一下我可以在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/");

        }
    }

不,您不能使用 Application_End 在真实站点中记录单点。

由于 Application_End 事件与任何请求无关,所以有些事情您不能做 - 您不能对特定用户采取行动或在某处重定向响应(因为没有 request/response开始。

的确,您可以清除或批量更新数据库中的信息,但这不会实现您 "enter logout date time of user" 的实际目标。

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

如果您的站点具有多个服务器,则当每个服务器重新启动 IIS 进程时也没有关联,这使得 Application_End 完全不适合 "user logged out",因为一台服务器可以主动服务请求而其他重启。

您最好的选择是通过在页面的每个请求/心跳 AJAX ping 上更新时间来显式地(即登录后 40 分钟)或滑动过期来使用户会话超时。