10秒后MVC3会话超时
需要一些ASP.Net Web应用程序中的会话超时问题的帮助。 基本上会话在登录后大约10-15秒到期。
附注:我使用FormsAuthentication和基本安全性的自定义组合
我的Session.IsNewSession在登录后3-4次良好的回发后设置为true。
我的Web.Config有以下……
我相信超时指的是分钟….
我有一个注册了ActionFilter的MVC 3应用程序
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new MyActionFilterAttribute()); }
在OnActionExecuting内部,我检查当前会话以防止访问未授权用户无法访问的控制器操作。
public override void OnActionExecuting(ActionExecutingContext filterContext) { HttpContext ctx = HttpContext.Current; Player player = SessionHelper.GetCurrentPlayer(filterContext.HttpContext.Session); if (player == null && ctx != null) { player = SessionHelper.GetCurrentPlayer(ctx.Session); } if (player == null || (player.IsAdministrator == false && player.IsCoach == false && player.IsCommittee == false)) { if (filterContext.Controller is HomeController || filterContext.Controller is AccountController) { base.OnActionExecuting(filterContext); return; } string ctxError = ctx != null ? "Context Exists" : "Context Doesnt Exist"; string sessionError = filterContext.HttpContext.Session != null ? "filterContext.HttpContext.Session Exists" : "filterContext.HttpContext.Session Doesnt Exist"; string requestSessionError = filterContext.RequestContext.HttpContext.Session != null ? "filterContext.RequestContext.HttpContext.Session Exists" : "filterContext.RequestContext.HttpContext.Session Doesnt Exist"; throw new SecurityException(string.Format("Attempt to access {0} by user at {1} - {2} ({3}, {4}, {5})", filterContext.HttpContext.Request.RawUrl, filterContext.HttpContext.Request.UserHostAddress, filterContext.HttpContext.Session, ctxError, sessionError, requestSessionError)); } base.OnActionExecuting(filterContext); }
所以我已经确定Web服务器比我的会话生命周期更快地刷新它的AppPool。 这将导致使用相同的SessionId,但也要设置IsNewSession标志。
由于我无法控制AppPool的生命周期,因此我能够在IIS中将会话保持在InProc模式。
我通过将会话状态持久性移动到托管的SqlServer数据库来解决该问题,从而允许会话在AppPool被回收的情况下保持不变。
我建议任何其他人在他们没有管理访问权限的服务器上托管时,看到其他人稳定的网站失去会话状态的解决方案。
哦,我发现IIS日志在这里毫无用处。 我发现,这里记录的最佳诊断是我自己的手动记录,以确定这是情景。