2013-11-27 76 views
3

無法使以下標準代碼生效。尋找一個完整的示例項目或幫助如何bug。 下面的代碼...MVC 4檢測會話超時

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (filterContext.HttpContext.Session != null) 
    { 
     if (filterContext.HttpContext.Session.IsNewSession) 
     { 
      string cookie = filterContext.HttpContext.Request.Headers["Cookie"]; 
      if ((cookie != null) && (cookie.IndexOf("_sessionId") >= 0)) 
      { 
       filterContext.Result = newRedirectResult("~/SessionExpired/Index"); //redirect anywhere to message user UI , never hits this breakpoint 
       return; 
      } 
     } 
    } 
    base.OnActionExecuting(filterContext); 

}

是檢查會話過期標準。 但是在我的情況下,行(cookie != null) && (cookie.IndexOf("_sessionId") >= 0) 總是返回假,因此用戶永遠不會被重定向。

我正在測試一個全新的嚮導創建的MVC 4項目。 我找不到完整的下載示例。我懷疑我的配置是錯的。

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="1" slidingExpiration="true" name=".ASPXFORMSAUTH" /> 
</authentication>  
<sessionState mode="InProc" timeout="1" cookieless="false"/> 

請告知爲什麼此代碼失敗或提供完整的下載示例項目的鏈接。 .Net 4.5 | VS 2012 |本地IIS Web服務器,IIS快遞

重:Detecting Session expiry on ASP.NET MVC

回答

1

嘗試在 「_sessionId」

像大寫的 「S」:

sessionCookie.IndexOf("_SessionId") >= 0) 

搜索是區分大小寫的。 此外,鏈接的文章你是指用途:

sessionCookie.IndexOf("ASP.NET_SessionId") >= 0) 
1

這是一個非常晚的答案,但它可能會幫助別人。

如果我沒有弄錯,對於這種方法的工作,窗體身份驗證超時必須設置爲比會話本身更高的時間。通過這種方式,當您創建新的會話時(在服務器內存中),來自身份驗證的Cookie仍會存在於用戶的計算機中,以指示用戶最近登錄了該用戶。

你應該嘗試以下操作:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" timeout="1000" slidingExpiration="true" name=".ASPXFORMSAUTH" /> 
</authentication>  
<sessionState mode="InProc" timeout="10" cookieless="false"/>