2014-01-30 67 views
3

我試圖檢測會話何時結束,然後將用戶重定向到主頁,然後在我的全局asax文件中完成此操作。在mvc4中的Global.asax中的會話超時重定向

我使用下面的代碼,我發現here

的Global.asax:

protected void Session_Start() 
    { 
     if (Context.Session != null) 
     { 
      if (Context.Session.IsNewSession) 
      { 
       string sCookieHeader = Request.Headers["Cookie"]; 
       if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        //intercept current route 
        HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current); 
        RouteData routeData = RouteTable.Routes.GetRouteData(currentContext); 


        //Substitute route Data Token Values for the Area 
        routeData.DataTokens["area"] = ""; 
        routeData.DataTokens["UseNamespaceFallback"] = true; 


        //substitute route values 
        routeData.Values["controller"] = "home"; 
        routeData.Values["action"] = "index"; 
        routeData.Values.Add("timedOut", "true"); 
        //routeData.Values["id"] = "timedOut"; 

        IRouteHandler routeHandler = routeData.RouteHandler; 
        RequestContext requestContext = new RequestContext(currentContext, routeData); 

        IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext); 
        httpHandler.ProcessRequest(Context); 

        Response.Flush(); 
        Response.End(); 
       } 
      } 
     } 
    } 

我覺得還好,因爲它在開發環境,但是當我嘗試我的服務器上(IIS7)我收到下面的錯誤。 「HttpApplication.AcquireRequestState」

我已經確定使用環節的問題,像here

「HttpContext.SetSessionStateBehavior」只能被調用,但我只是不能得到它的工作。我認爲問題是在下面的行

IHttpHandler httpHandler = routeHandler.GetHttpHandler(requestContext); 
        httpHandler.ProcessRequest(Context); 

但是我似乎無法得到這個在服務器上工作。任何想法或建議?

+0

當會話在服務器上結束時,沒有使用連接,所以會話結束對用戶無能爲力。關於您可以做的最好的事情是在與會話超時匹配的頁面中放置一個計時器。 –

回答

4

您可以爲您的控制器的自定義操作過濾處理這個:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using System.Reflection; 


namespace Web { 


    public class SessionExpireFilterAttribute : ActionFilterAttribute { 


     public override void OnActionExecuting(ActionExecutingContext filterContext) { 
      HttpContext ctx = HttpContext.Current; 


      // check if session is supported 
      if (ctx.Session != null) { 


       // check if a new session id was generated 
       if (ctx.Session.IsNewSession) { 


        // If it says it is a new session, but an existing cookie exists, then it must 
        // have timed out 
        string sessionCookie = ctx.Request.Headers[ "Cookie" ]; 
        if ((null != sessionCookie) && (sessionCookie.IndexOf ("ASP.NET_SessionId") >= 0)) { 


         ctx.Response.Redirect ("~/Home/Login"); 
        } 
       } 
      } 


      base.OnActionExecuting (filterContext); 
     } 
    } 
} 

然後,我將這個過濾器適用於我的控制器操作方法如下所示:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.Mvc; 
    using System.Web.Mvc.Ajax; 

    namespace Web.Controllers { 

     public class HomeController : Controller { 

      [SessionExpireFilter] 
      public ActionResult Index() { 
       // This method will not execute if our session has expired 

       // render Home Page 
       return View(); 
      } 

      public ActionResult Login() { 
       // render Login page 
       return View(); 
      } 
     } 
    } 
+0

我一直在試圖找到一個OP解決方案相同的問題..我發現這個網站上的幾個答案說類似於你發佈的東西,這工作正常,直到當前會議實際到期。如果你在頁面上並且會話過期,它甚至不會觸及屬性,因此它將重定向。我發現其他人也有同樣的問題。 – user1189352