ASP.NET Core Razor Pages缓存不生效,Cache-Control异常求助
问题解决:ASP.NET Core响应Cache Control头始终为no-cache、no-store的问题
问题原因
- 未映射Razor Pages端点:你的Program.cs里缺少
app.MapRazorPages();,导致Razor Pages的特性(包括[ResponseCache])完全没生效。 - Antiforgery中间件强制覆盖缓存头:默认情况下,Antiforgery会给带有CSRF令牌的请求自动添加
no-cache, no-store,直接冲掉你手动配置的缓存规则。 - 缓存配置冲突:你同时使用了自定义中间件设置缓存头和
[ResponseCache]特性,规则不一致,且中间件顺序也不符合要求。
解决步骤
- 添加Razor Pages端点映射
在Program.cs的所有中间件配置最后添加这行代码,确保Razor Pages能正常处理请求:
app.MapRazorPages();
- 修改Antiforgery配置,允许自定义缓存
调整Antiforgery的设置,阻止它自动覆盖缓存头:
builder.Services.AddAntiforgery(o => { o.HeaderName = "XSRF-TOKEN"; // 禁止Antiforgery强制设置no-cache规则 o.SuppressCacheControlHeader = true; });
注意:如果页面包含表单,不建议全局开启这个配置,针对不需要CSRF令牌的页面单独添加
[IgnoreAntiforgeryToken]特性即可,避免安全风险。
- 统一缓存配置方式
选择一种配置方式使用,避免冲突:
- 若想用
[ResponseCache]特性,删除自定义的缓存中间件代码:
// 删除这段冲突代码 // app.Use(async (context, next) => // { // context.Response.GetTypedHeaders().CacheControl = // new Microsoft.Net.Http.Headers.CacheControlHeaderValue() // { // Public = true, // MaxAge = TimeSpan.FromSeconds(10) // }; // context.Response.Headers[Microsoft.Net.Http.Headers.HeaderNames.Vary] = // new string[] { "Accept-Encoding" }; // // await next(); // });
- 若想用全局中间件配置,删除
IndexModel上的[ResponseCache]特性。
- 调整中间件顺序
确保UseResponseCaching放在正确位置,在路由处理之前执行:
app.UseHttpsRedirection(); app.UseResponseCaching(); // 放在此处,位于路由和页面处理逻辑之前 app.UseRouting(); app.UseAuthorization(); app.UseWebMarkupMin(); // 其他中间件... app.MapRazorPages();
验证
重启应用后访问Index页面,检查响应头的Cache-Control,应该会符合你设置的规则(比如用特性时为public, max-age=30,用中间件时为public, max-age=10)。
内容的提问来源于stack exchange,提问作者K V Sharma
相关产品推荐
相关产品推荐

