代码之家  ›  专栏  ›  技术社区  ›  Michel

ASP.NET MVC页面上的ResponseCache在操作时确实返回新内容,而不是缓存

  •  0
  • Michel  · 技术社区  · 7 年前

    我遵循了这个教程( https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response?view=aspnetcore-2.1 )在控制器操作上实施ResponseCache。

    services.AddResponseCaching(); app.UseResponseCaching(); [ResponseCache( Duration = 30)] 在我的控制器上。

    然后我加了一个 <h2>@DateTime.Now</h2> 在我看来和我所期望的。。。。是同一个日期时间,现在是30秒。

    但它没有,它只是在每次重新加载时显示新时间(F5)。

    我确保我的chrome开发工具没有说“禁用缓存”。

    在我的本地机器上,无论是否打开ChromeDevTools,现在都在尝试一个全新的.net核心mvc项目。

    我注意到(在devtools打开的情况下)请求有以下标题: Cache-Control: max-age=0 我以为这会有什么意义,因为它看起来像是请求说“没有缓存”,但这让我觉得很奇怪,因为我没有把标题放进去,我想说chrome的默认行为不会是忽略缓存?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Chris Pratt    7 年前

    头像 Cache-Control: max-age=0 有效地禁用所有缓存。基本上,资源一出网就过期了,所以它们总是被提取的。此标头源自服务器。客户与此无关。

    documentation 列出了在缓存响应之前必须满足的以下条件,无论您执行何种操作:

    • 该请求必须产生一个状态代码为200(正常)的服务器响应。
    • 终端中间件(如静态文件中间件)不得在响应缓存中间件之前处理响应。
    • 缓存控制标头参数必须有效,并且响应必须标记为公共而不是私有。
    • 如果缓存控制标头不存在,则Pragma:no cache标头不得存在,因为缓存控制标头在存在时会覆盖Pragma标头。
    • Variy标头参数必须有效且不等于*。
    • 内容长度标题值(如果设置)必须与响应正文的大小匹配。
    • 响应不能像Expires标头和max age和s-maxage缓存指令所指定的那样过时。
    • 响应缓冲必须成功,并且响应的大小必须小于配置的或默认的SizeLimit。

    但是,在这种情况下,服务器应该发送 Cache-Control: no-cache max-age=0 . 因此,我倾向于在某个地方出现一些错误配置,您设置了这个最大年龄值,但要么忘记了,要么忽略了它。

        2
  •  0
  •   Johan Kronberg    5 年前

    这对我来说是一个3.1版本的应用程序,不允许Firefox或Chrome中的F5/Ctrl+F5或开发者工具绕过服务器缓存来获得完整响应。

    UseResponseCaching() .

    // Middleware that fixes server caching on F5/Reload
    app.Use(async (context, next) =>
    {
        const string cc = "Cache-Control";
    
        if (context.Request.Headers.ContainsKey(cc))
        {
            context.Request.Headers.Remove(cc);
        }
    
        const string pragma = "Pragma";
    
        if (context.Request.Headers.ContainsKey(pragma))
        {
            context.Request.Headers.Remove(pragma);
        }
    
        await next();
    });
    
    app.UseResponseCaching();
    

    没有注意到任何问题。。。