会话超时未命中操作过滤器
Session Timeout Doesn't Hit the Action Filter
我在 Startup.Auth.cs:
中启用了会话超时
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromMinutes(1)
}
将其设置为 1 分钟以进行测试。现在我已经创建了一个动作过滤器:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class SessionExpireFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
base.OnActionExecuting(filterContext);
}
}
并通过添加 filters.Add(new SessionExpireFilterAttribute());
在 FilterConfig.cs
中注册。我还在 customercontroller
class.
上放置了属性 [SessionExpireFilter]
现在发生的情况是,如果我在会话过期时单击向操作 customer/edit
发送请求的按钮,代码会在 customercontroller
constructor
然后返回 200。它永远不会遇到 actionfilter 中的断点。它也从未击中实际动作 edit
。
有什么想法吗?
谢谢。
从 HTTP header.
中删除 Cache-Control
防止在 MVC 中缓存,我们创建了自己的属性,您也可以这样做。这是我们的代码:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
}
然后用 [NoCache] 装饰你的控制器。或者为所有人做这件事,你可以把属性放在基础 class 的 class 上,你从那里继承你的控制器(如果你有一个)就像我们在这里:
[NoCache]
public class ControllerBase : Controller, IControllerBase
如果你需要的话,你也可以用这个属性装饰一些动作non-cacheable,而不是装饰整个控制器。
或者您可以使用内置的缓存属性来防止缓存。
对于 .net 框架:[OutputCache(NoStore = true, Duration = 0)]
对于 .net 核心:[ResponseCache(NoStore = true, Duration = 0)]
我在 Startup.Auth.cs:
中启用了会话超时 app.UseCookieAuthentication(new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromMinutes(1)
}
将其设置为 1 分钟以进行测试。现在我已经创建了一个动作过滤器:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class SessionExpireFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
base.OnActionExecuting(filterContext);
}
}
并通过添加 filters.Add(new SessionExpireFilterAttribute());
在 FilterConfig.cs
中注册。我还在 customercontroller
class.
[SessionExpireFilter]
现在发生的情况是,如果我在会话过期时单击向操作 customer/edit
发送请求的按钮,代码会在 customercontroller
constructor
然后返回 200。它永远不会遇到 actionfilter 中的断点。它也从未击中实际动作 edit
。
有什么想法吗?
谢谢。
从 HTTP header.
中删除Cache-Control
防止在 MVC 中缓存,我们创建了自己的属性,您也可以这样做。这是我们的代码:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
filterContext.HttpContext.Response.Cache.SetNoStore();
base.OnResultExecuting(filterContext);
}
}
然后用 [NoCache] 装饰你的控制器。或者为所有人做这件事,你可以把属性放在基础 class 的 class 上,你从那里继承你的控制器(如果你有一个)就像我们在这里:
[NoCache]
public class ControllerBase : Controller, IControllerBase
如果你需要的话,你也可以用这个属性装饰一些动作non-cacheable,而不是装饰整个控制器。
或者您可以使用内置的缓存属性来防止缓存。
对于 .net 框架:[OutputCache(NoStore = true, Duration = 0)]
对于 .net 核心:[ResponseCache(NoStore = true, Duration = 0)]