在mvc4中的Global.asax中的会话超时重定向

我试图检测会话何时结束,然后在我的全局asax文件中完成此操作后将用户重定向到主页。

我使用下面的代码,我在这里找到

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)上尝试它时,我得到以下错误。

‘HttpContext.SetSessionStateBehavior’只能在’HttpApplication.AcquireRequestState’之前调用

我已经使用像这里的链接确定了这个问题,但我不能让它工作。 我相信问题在下面

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

但是我似乎无法在服务器上运行它。 有什么想法或建议吗?

您可以为控制器创建一个自定义操作筛选器来处理此问题:

 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 ); } } } 

然后,我会将此filter应用于我的Controller操作方法,如下所示:

  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(); } } }