2013-09-05 122 views
0
  • 林後在MVC4應用程序會話超時處理無限循環有一個MVC 4 Web應用程序。
    • 部署到我的IIS7環境。
    • 它使用Windows身份驗證和模擬。
    • 它由公司策略設置爲在15分鐘後會話超時。

這總是在asp.net應用程序工作正常。但是我現在擁有一個MVC4應用程序,所以我沒有使用global.asax和session_start來確定會話是否超時並重定向,而是現在已經設置了一個會話過期操作過濾器。問題與空閒超時

所有工作正常,重新引導時會timesout,直到用戶離開應用程序閒置的應用程序池.The空閒超時時間爲20分鐘,這我覺得是這裏的問題。

如果我的用戶離開他的應用程序並前往他們經常做的會議,並且達到空閒超時,當他們回來並嘗試做某個時間並且應用程序試圖重新指向會話超時時,我可以在錯誤日誌中看到它被困在一個循環中,並且從不重定向。

它是事實(即空閒超時)後來不及嘗試重新直接?以前在asp.net應用程序(非MVC)中,我曾經總是在global.asax的會話啓動中執行此操作(即重定向會話超時),並且它工作得很好。作爲obviosuly,這一事件總是踢的應用閒置超時之前打

任何幫助,將不勝感激,這是我爲我的會話處理代碼:

public class SessionExpireAttribute : ActionFilterAttribute 
    { 
     /// <summary> 
     /// Called by the ASP.NET MVC framework after the action method executes. 
     /// </summary> 
     /// <param name="filterContext">The filter context.</param> 
     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      base.OnActionExecuted(filterContext); 
     } 

     ///<summary> 
     ///Called by the ASP.NET MVC framework before the action method executes. 
     ///</summary> 
     ///<param name="filterContext">The filter context.</param> 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      if (filterContext.HttpContext.Session != null) 
      { 
       if (filterContext.HttpContext.Session.IsNewSession) 
       { 
        var sessionStateDetails =(SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState"); 
        var sessionCookie = filterContext.HttpContext.Request.Headers["Cookie"]; 
        if ((sessionCookie != null) && (sessionCookie.IndexOf(sessionStateDetails.CookieName) >= 0)) 
        { 
         if (filterContext.HttpContext.Request.IsAjaxRequest()) 
         { 
          filterContext.HttpContext.Response.Clear(); 
          filterContext.HttpContext.Response.StatusCode = 403; 

         } 
         else 
         { 

          RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary(); 
          redirectTargetDictionary.Add("action", "SessionTimeout"); 
          redirectTargetDictionary.Add("controller", "Home"); 

          filterContext.Result = new RedirectToRouteResult(redirectTargetDictionary); 

         } 
+0

即使在MVC中,你仍然可以使用Session_Start,那麼這樣做有什麼問題嗎? –

+0

是session_start仍然在MVC4中工作,並重新正確指示。然而,從博客我一直在閱讀,我認爲使用處理程序是更好的做法?有什麼想法嗎 ?這就是我沿着這條路線走下去的原因。 – Alicia

回答

0

如果有人是有一個類似的問題,我最終解決了這個問題,使用philpalmieri's jquery插件,可以在這裏找到Github。應用進入閒置狀態前所

如果設置爲20分鐘的空閒超時,並調用它以這種方式,它總是重新定向到會話超時,所以我inifinte循環永遠不會發生:

function logout() { 
    ////session redirect goes here 
    var pathArray = window.location.pathname.split('/'); 
    var segment_1 = pathArray[1]; 
    window.location = window.location.protocol + "//" + window.location.host + "/" + segment_1 + "/Home/SessionTimeout"; 
} 

$(document).ready(function() { 
    var SEC = 1000; 
    var MIN = 60 * SEC; 
     $(document).idleTimeout({ 
      inactivity: 20 * MIN, 
      noconfirm: 2 * SEC, 
      redirect_url: 'javascript:logout()', 
      click_reset: true, 
      alive_url: '', 
      logout_url: '' 
     }); 
}); 

如果任何人有更好的解決方案,我很樂意聽到它...