You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET MVC Core中用Action Filter移除Pragma: no-cache响应头

解决方案:用Action Filter精准控制ARR磁盘缓存的页面范围

我来帮你梳理下问题所在,以及能生效的实现方案:

你的代码没成功主要有三个核心原因:Headers.Remove方法调用错误、执行时机过早,以及没考虑ARR缓存判断的完整逻辑。


问题分析

  1. 方法调用错误:Response.Headers.Remove只需要传入头的键名(比如"Pragma"),不需要传值。你之前写的Remove("Pragma", "no-cache")是错误的,这个方法没有双参数重载,所以实际没执行移除操作。
  2. 执行时机过早:在OnActionExecuting阶段修改响应头,后续ASP.NET框架的默认逻辑(比如视图渲染、全局缓存策略)可能会重新添加这些缓存头,覆盖你的修改。
  3. ARR缓存逻辑:ARR不仅参考Pragma头,还会依据Cache-Control(比如no-cache、no-store)、Expires等头判断是否缓存,只处理Pragma不足以达到预期效果。

正确的Action Filter实现

根据你的需求(部分页面无需磁盘缓存,即让ARR不缓存这些页面),下面是针对性的Filter实现:

public class DisableARRCacheAttribute : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var response = filterContext.HttpContext.Response;
        
        // 添加阻止ARR缓存的响应头
        response.Headers.Add("Pragma", "no-cache");
        response.Headers.Add("Cache-Control", "no-cache, no-store, must-revalidate");
        response.Headers.Add("Expires", "0");
        
        // 如果默认全站有允许缓存的头,也可以移除它们
        if (response.Headers.ContainsKey("Cache-Control"))
        {
            // 先移除可能存在的允许缓存的头,再添加阻止缓存的
            response.Headers.Remove("Cache-Control");
            response.Headers.Add("Cache-Control", "no-cache, no-store, must-revalidate");
        }
        
        base.OnResultExecuted(filterContext);
    }
}

如果你的需求是让部分页面被ARR缓存(移除阻止缓存的头),可以用这个版本:

public class AllowARRCacheAttribute : ActionFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var response = filterContext.HttpContext.Response;
        
        // 移除所有阻止缓存的头
        if (response.Headers.ContainsKey("Pragma"))
        {
            response.Headers.Remove("Pragma");
        }
        if (response.Headers.ContainsKey("Cache-Control"))
        {
            response.Headers.Remove("Cache-Control");
        }
        if (response.Headers.ContainsKey("Expires"))
        {
            response.Headers.Remove("Expires");
        }
        
        // 添加允许ARR缓存的头(根据业务调整max-age时长)
        response.Headers.Add("Cache-Control", "public, max-age=86400");
        response.Headers.Add("Expires", DateTime.Now.AddDays(1).ToString("R"));
        
        base.OnResultExecuted(filterContext);
    }
}

如何使用

在需要特殊缓存处理的Action或控制器上直接添加特性即可:

// 禁止该页面被ARR缓存
[DisableARRCache]
public ActionResult NoCachePage()
{
    return View();
}

// 允许该页面被ARR缓存
[AllowARRCache]
public ActionResult CacheablePage()
{
    return View();
}

额外注意事项

  • 确保没有其他全局中间件或缓存策略在Filter之后修改响应头,否则会覆盖你的设置。
  • 确认ARR配置正确:ARR默认会严格遵循响应头的缓存指令,只要头信息设置正确,就能精准控制缓存范围。

内容的提问来源于stack exchange,提问作者Kalpesh Boghara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:31:13