0

我正在使用ActionFilter來檢查用戶的會話是否是該用戶的最新會話。如果他們已經登錄另一個會話,則舊會話無效。所以,我正在檢查每個被調用的操作,如果他們沒有使用最新的會話,就將它們簽出。我遇到的問題是我的方法不適用於AJAX調用。正常的GET或POST調用工作正常。AJAX調用時ActionFilterAttribute出錯

public class DuplicateLoginFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var user = Membership.GetUser(HttpContext.Current.User.Identity.Name); 
     if (user != null) 
     { 
      if (!PortalDA.GetUserSession(user.UserName).Trim().Equals(HttpContext.Current.Session.SessionID)) 
      { 

       FormsAuthentication.SignOut(); 
       filterContext.Result = new RedirectResult(@"\Home\SessionExprired"); 
      } 
     } 
     base.OnActionExecuting(filterContext); 
    } 

我想我解決這個問題的最大問題是,我得到一個錯誤,但我無法捕捉它在任何地方。

我在webconfig中打開了自定義錯誤。我重寫了所有控制器中的OnException事件。我也覆蓋了global.asax中的Application_Error事件。

我已經遍歷代碼,當我進行AJAX調用時,我返回SessionExpired視圖。但是在那之後的某個地方發生錯誤,我不能再繼續下去。錯誤不會被覆蓋的錯誤事件捕獲。然後我發送到自定義錯誤頁面。

我懷疑它與HTTPHeaders有關,但我不明白他們知道如何解決它,如果它是AJAX調用。

謝謝!用你的路線,而不是硬編碼的網址

回答

1

嘗試重定向:

filterContext.Result = new RedirectToRouteResult(
    new RouteValueDictionary(new 
    { 
     controller = "Home", 
     action = "SessionExpired" 
    } 
)); 

然後確保在HomeController存在以及相應的視圖,且該操作被擊中SessionExpired行動。很明顯,因爲您在AJAX調用中重定向,所以您在AJAX調用的成功回調中將獲得的這個SessionExpired視圖的HTML作爲參數傳遞。不要指望瀏覽器重定向。您將不得不使用window.location.href手動重定向瀏覽器。這就是爲什麼在這種情況下(AJAX之一)最好返回Json結果,而不是重定向到會話過期操作。然後在客戶端,您可以手動執行重定向。

+0

我得到了相同的結果(發送到錯誤頁面)。是的,行動和看法存在。它在正常的GET或POST時有效。只是沒有在AJAX電話 –

+0

這樣做!我返回了一個JSON對象並在JQuery中重定向。謝謝! –