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

ASP.NET Core中间件中Cache-Control未生效问题排查

问题原因

你的缓存中间件执行顺序在UseMvc之前,而UseMvc后续的处理逻辑(比如对应image/resize的控制器动作、ASP.NET Core内置的响应处理组件)重新覆盖了你设置的Cache-Control响应头,导致你的缓存配置未生效。

中间件的执行逻辑是:请求阶段按注册顺序从前到后执行,响应阶段则按注册顺序从后到前执行。你当前的中间件先设置了响应头,但后续Mvc处理响应时又修改了这个头,最终返回给客户端的是Mvc设置的结果。

解决方法

1. 调整中间件顺序,将缓存中间件移到UseMvc之后

把缓存中间件放在Mvc之后,这样它会在Mvc生成响应后再执行,确保你的头设置最后生效,不会被后续组件覆盖。同时修改中间件逻辑,先调用next.Invoke()让Mvc完成响应处理,再修改头:

app.UseAuthentication();
app.UseAuthorization();

// 先注册Mvc中间件
app.UseMvc(options =>
{
    options.MapRoute("Default", "{controller=Default}/{action=Index}/{id?}");
});

// 再注册缓存中间件
app.Use(async (context, next) =>
{
    await next.Invoke(); // 先让Mvc处理请求生成响应
    
    if (context.Request.Path.ToString().Contains("image/resize"))
    {
        // 加上public,允许CDN、浏览器等公共缓存存储该响应
        context.Response.Headers["Cache-Control"] = "public, max-age=31536000";
    }
    else
    {
        context.Response.Headers["Cache-Control"] = "no-cache, no-store, must-revalidate";
        context.Response.Headers["Pragma"] = "no-cache";
        context.Response.Headers["Expires"] = "0";
    }
});

2. 检查image/resize对应的控制器动作

查看处理图片缩放的控制器方法中,是否有手动设置Cache-Control头的代码(比如Response.Headers.Add("Cache-Control", "public,max-age=30")),如果有,删除或修改为你需要的缓存策略。

3. 验证缓存头设置

修改完成后,重新请求图片接口,查看响应头是否已经更新为public, max-age=31536000。

内容的提问来源于stack exchange,提问作者Big boy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 23:40:17