Application_End注销用户在global.asax中

时间:2016-09-02 05:30:16

标签: c# asp.net-mvc global-asax

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

但我只是想知道让所有用户在Application End注销是正确的,我只想输入用户的注销日期时间。

    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/");

        }
    }

1 个答案:

答案 0 :(得分:0)

不,你不能使用Application_End在真实网站上录制唱歌。

由于Application_End事件与任何请求无关,因此您无法执行某些操作 - 您无法对特定用户或某处的重定向响应执行操作(因为没有请求/响应开始)。

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

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

如果您有一个包含多个服务器的非平凡站点,则每个服务器重新启动IIS进程时也没有相关性,使 resetAccount: function( email ) { var deferred = $q.defer(); $http({ url: ApplicationConstants.apiServerPath + 'api/users/reset', method: 'POST', data: 'email=' + email, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }) .success( function( data ) { deferred.resolve( data ); }) .error( function( error ) { deferred.reject( error ); }); return deferred.promise; } 完全不适合“用户注销”,因为一个服务器可以主动提供请求而其他服务器重新启动。

最好的办法是明确地(即登录后40分钟)或滑动到期时超时用户会话,方法是更新页面上每个请求/心跳AJAX ping的时间。