MVC 4检测会话超时

时间:2013-11-27 15:49:48

标签: asp.net-mvc-4

无法使以下标准代码生效。寻找完整的示例项目或有关如何发布bug的帮助。 以下代码......

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) 始终返回false ,因此用户永远不会被重定向。

我正在测试一个全新的向导创建的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 Express

re:Detecting Session expiry on ASP.NET MVC

2 个答案:

答案 0 :(得分:1)

尝试将“_sessionId”中的“s”大写

像:

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

搜索区分大小写。 此外,您所指的链接文章使用:

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

答案 1 :(得分:1)

这是一个非常晚的答案,但它可能对其他人有帮助。

如果我没有弄错,为了使这种方法起作用,表单身份验证超时必须设置为比会话本身更高的时间。这样,当您创建新会话(在服务器内存中)时,来自身份验证的cookie仍将存在于用户的计算机中,以指示用户最近已注册。

您应该尝试以下方法:

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