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
相关产品推荐
相关产品推荐

