我想问一下,我可以在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/");
}
}
答案 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的时间。