2013-02-13 56 views
0

我正在使用Asp.net MVC 3应用程序,其中我有一个在帐户控制器中注销的方法。如果用户会话在服务器上过期,应该从应用程序中注销用户

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

       this._authenticationService.SignOut(); 

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

       return View("Error"); 
      } 
     } 

我想打电话从Session_End中的方法将此方法的global.asax.cs或是否有任何其他的方式来调用RedirectToAction("Login", "Account");从的global.asax.cs文件。

+0

你试图做一些用户的要求之外? (还要注意[Session_End没有为SQL /状态服务会话状态解雇](http://stackoverflow.com/questions/852942/how-do-you-programatically-end-a-session-in-asp-net) )。 – 2013-02-13 06:08:37

回答

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)); 
    } 
+0

在Response.Clear()行我的调试器控件从应用程序中熄灭,下一行没有执行。 – Billz 2013-02-13 06:28:52

+0

你可以删除该行,并尝试 – 2013-02-13 06:32:09

+0

在var rc = new RequestContext(new HttpContextWrapper(Context),routeData);同样的事情正在发生...... – Billz 2013-02-13 06:37:10

0

“Session_End”不对应于任何请求或任何请求流,因此重定向/执行控制器操作不会将HTML返回给浏览器。只要浏览器向服务器发出请求,几乎没有机会获得执行的“Session_End”。可能您可以使用存储在会话中的对象,并且在会话结束时,对象将从会话存储中放弃。

在BeginCreate事件或MVC中的全局过滤器中编写通用代码可以检查该对象的存在,并且可以根据需要重定向用户注销操作。

0

我不知道您是否可以在您当前的项目中使用signalr,但如果是的话,如果会话过期,可以使用signalr在客户端调用重定向。

类似的东西在服务器端:

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

在客户端,像下面这样可以使重定向:

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