2013-02-13 52 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; } 
相關問題