如果用户会话在服务器上过期,则应从应用程序注销用户

时间:2013-02-13 06:01:35

标签: c# asp.net asp.net-mvc-3 session session-state

我正在开发Asp.net MVC 3应用程序,其中我有一个在帐户控制器中注销的方法。

 public ActionResult LogOff()
        {
            try
            {
               // Session.User = null;

                this._authenticationService.SignOut();

                return RedirectToAction("Login", "Account");
            }
            catch (Exception e)
            {

                return View("Error");
            }
        }

我想从global.asax.cs中的Session_End方法调用此方法,或者是否有其他方法可以从global.asax.cs文件中调用RedirectToAction("Login", "Account");

4 个答案:

答案 0 :(得分:0)

您需要使用基于Ajax + JavaScript的解决方案,只需检查可以帮助您的类似线程:

Client-side session timeout redirect in ASP.Net

答案 1 :(得分:0)

在Global.asax.cs文件中尝试这样:

protected void Session_End()
    {
        // Clear the error on server. 
        Server.ClearError(); 
        Response.Clear(); 

        RouteData routeData = new RouteData(); 

        routeData.Values.Add("controller", "Account"); 
        routeData.Values.Add("action", "Login"); 


        // Call target Controller and pass the routeData. 
        IController AccountMainController = new AccountController(); 
        AccountMainController.Execute(new RequestContext( 
                new HttpContextWrapper(Context), routeData));
    }

答案 2 :(得分:0)

“Session_End”与任何请求或任何请求流都不对应,因此重定向/执行控制器操作不会将HTML返回给浏览器。只要浏览器向服务器发出请求,就很难有机会执行“Session_End”。可能你可以使用存储在会话中的对象,当会话结束时,对象将从会话存储中放弃。

在SWC中的Begin_Request事件或全局过滤器中编写公共代码可以检查该对象是否存在,并且可以在需要时将用户重定向到注销操作。

答案 3 :(得分:0)

我不知道您是否能够在当前项目中使用信号器,但如果您是,则可以使用信号器在会话过期时调用客户端上的重定向。

在服务器端上有类似的东西:

protected void Session_End()
{
    GlobalHost.ConnectionManager.GetHubContext<ConnectionStateHub>().Clients[{yourClientsId}].SessionExpired({yourRedirectTarget});
}

在客户端,类似以下内容可以进行重定向:

var sessionHub = $.connection.sessionHub;
sessionHub.sessionExpired = function(target) { window.location = target; }