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

ASP.NET Core Razor Pages缓存不生效,Cache-Control异常求助

问题解决:ASP.NET Core响应Cache Control头始终为no-cache、no-store的问题

问题原因

  1. 未映射Razor Pages端点:你的Program.cs里缺少app.MapRazorPages();,导致Razor Pages的特性(包括[ResponseCache])完全没生效。
  2. Antiforgery中间件强制覆盖缓存头:默认情况下,Antiforgery会给带有CSRF令牌的请求自动添加no-cache, no-store,直接冲掉你手动配置的缓存规则。
  3. 缓存配置冲突:你同时使用了自定义中间件设置缓存头和[ResponseCache]特性,规则不一致,且中间件顺序也不符合要求。

解决步骤

  1. 添加Razor Pages端点映射
    在Program.cs的所有中间件配置最后添加这行代码,确保Razor Pages能正常处理请求:
app.MapRazorPages();
  1. 修改Antiforgery配置,允许自定义缓存
    调整Antiforgery的设置,阻止它自动覆盖缓存头:
builder.Services.AddAntiforgery(o => 
{
    o.HeaderName = "XSRF-TOKEN";
    // 禁止Antiforgery强制设置no-cache规则
    o.SuppressCacheControlHeader = true;
});

注意:如果页面包含表单,不建议全局开启这个配置,针对不需要CSRF令牌的页面单独添加[IgnoreAntiforgeryToken]特性即可,避免安全风险。

  1. 统一缓存配置方式
    选择一种配置方式使用,避免冲突:
  • 若想用[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]特性。
  1. 调整中间件顺序
    确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:47:33