会话超时未命中操作过滤器

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)]