[英]MVC3 Session timeout after 10 seconds
在ASP.Net Web应用程序中需要一些有关会话超时问题的帮助。 本质上,会话在登录后约10-15秒过期。
旁注:我使用FormsAuthentication和基本安全性的自定义组合
登录后经过3-4次良好的回发后,我的Session.IsNewSession设置为true。
我的Web.Config具有以下内容...
<sessionState mode="InProc" timeout="130" regenerateExpiredSessionId="true" stateNetworkTimeout="120" compressionEnabled="true" cookieless="UseCookies" />
<authentication mode="Forms">
<forms timeout="120" ticketCompatibilityMode="Framework40" enableCrossAppRedirects="true" />
</authentication>
我认为超时是指分钟。
我有一个注册了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日志在这里毫无用处。 我发现,最好的诊断日志记录是我自己的手动日志记录,以确定是否属于这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.