Asp.net core ResponseCache属性不在客户端缓存数据

Asp.net core ResponseCache属性不在客户端缓存数据,asp.net-core,asp.net-core-mvc,asp.net-core-1.0,coreclr,Asp.net Core,Asp.net Core Mvc,Asp.net Core 1.0,Coreclr,在ASP.NET核心应用程序中,我有一个返回一些数据的操作方法。我想在客户端缓存此数据。因此,基于操作方法,我可以使用ResponseCache属性。此属性在响应中添加缓存控制头 响应缓存是指在HTTP上指定与缓存相关的头 ASP.NET核心MVC操作的响应。这些标题指定了 您希望客户端和中间(代理)计算机缓存响应 对于某些请求(如果有)。这可以减少 客户端或代理向web服务器发出的请求,因为 同一行动的请求可由客户或代理的 缓存 也 响应缓存不会在web服务器上缓存响应。信息技术 与输出缓存不

在ASP.NET核心应用程序中,我有一个返回一些数据的操作方法。我想在客户端缓存此数据。因此,基于操作方法,我可以使用
ResponseCache
属性。此属性在响应中添加
缓存控制

响应缓存是指在HTTP上指定与缓存相关的头 ASP.NET核心MVC操作的响应。这些标题指定了 您希望客户端和中间(代理)计算机缓存响应 对于某些请求(如果有)。这可以减少 客户端或代理向web服务器发出的请求,因为 同一行动的请求可由客户或代理的 缓存

响应缓存不会在web服务器上缓存响应。信息技术 与输出缓存不同,输出缓存将响应缓存在 ASP.NET和ASP.NET MVC早期版本中的服务器

这就是我的动作方法

public class LookupController : Controller
{
    [HttpGet]
    [ResponseCache(Duration = 120)]
    public IEnumerable<StateProvinceLookupModel> GetStateProvinces()
    {
        return _domain.GetStateProvinces();
    }
}
公共类LookupController:控制器
{
[HttpGet]
[响应缓存(持续时间=120)]
公共IEnumerable GetStateProvisions()
{
返回_domain.getStateProvisions();
}
}
然后我使用browser作为调用方法 以下是请求和响应头

请注意,响应头具有预期的
缓存控制:public,max-age-120
。 但是,如果使用F5刷新页面(120秒之前),GetStateProvince操作方法中的调试器断点将始终命中。这意味着它不会在客户端保存数据

我还需要做什么来启用客户端缓存

更新
我尝试过使用IE、Chrome和POSTMAN,但运气不佳。每次我在地址栏中键入url或点击刷新,客户端(即浏览器或邮递员)都会调用action方法。

首先,我想澄清几件事,我相信您已经知道了

  • ResponseCache无论如何都不等于OutputCache

  • ResponseCache符合我的思维集标题,但它不会缓存服务器端的任何内容

  • 现在,如果您想缓存与OutputCache相同的内容,那么您可能必须使用刚刚发布的preview release 1.1

    ASP.net core 1.1预览版

    他们引入了新的响应缓存中间件。响应缓存中间件


    这里有它的演示

    实际上ResponseCache属性按预期工作。
    不同之处在于,如果在网站页面中导航(案例1),或使用后退和前进按钮(,则在刷新页面时不缓存响应)

    作为案例1的一个例子,我有以下几点:

    • 你在第二页
    • 键入其他url,然后单击“输入”或单击网页中的链接:
    • 再次键入url(您将看到这次从磁盘缓存中获取对此url的响应)
    正如您将在文章中看到的,如下所述:

    在浏览器会话期间,浏览网站内的多个页面或使用“后退”和“前进”按钮访问页面,将从本地浏览器缓存(如果未过期)提供内容。
    但当通过F5刷新页面时,请求将转到服务器,页面内容将被刷新。您可以通过使用F5刷新联系人页面进行验证。
    因此,当您点击F5时,响应缓存过期值在服务内容方面没有任何作用。您应该看到200个联系人请求的响应

    参考文献:
    [1].
    [2].

    [3] :

    长话短说,使用如下
    ResponseCache
    属性足以使基于过期的客户端缓存在全新的默认dotnet核心项目中工作(包括
    异步
    方法):

    [HttpGet]
    [响应缓存(持续时间=120)]
    公共IEnumerable GetStateProvisions()
    {
    返回_domain.getStateProvisions();
    }
    
    这在上面的屏幕截图中正常工作,因为在那里可以看到
    缓存控件:public,max age=120
    。在大多数情况下,浏览器不会在过期之前发送后续请求(即在接下来的120秒或2分钟内),但这是浏览器(或其他客户端)的决定

    如果请求被发送,则可能是某些中间件或服务器配置覆盖了响应头,或者客户机忽略了缓存指令。在上面的屏幕截图中,客户端忽略缓存,因为缓存控制头在那里

    忽略客户端缓存并发送请求的常见情况:

    • 在没有证书的情况下使用HTTPS(或无效证书,这在本地开发中很常见,因此请确保在测试缓存时使用HTTP,或信任自签名证书)时使用任何类型的缓存
    • 大多数浏览器开发工具在打开时默认禁用缓存,这可以禁用
      • 浏览器通常发送额外的标题,Chrome发送
        缓存控制:无缓存
    • 直接刷新(即Ctrl+F5)将指示大多数浏览器不使用缓存,并在不考虑年龄的情况下发出请求
      • 浏览器通常会发送额外的标题,Chrome会发送
        缓存控制:max age=0
        (这在屏幕截图中可见)
    • 邮递员发送
      缓存控制:no Cache
      头,使其绕过本地缓存,导致发送请求;您可以从设置对话框中禁用它,在这种情况下,将不再使用上述客户端缓存配置发送请求
    此时,我们已经超越了基于过期的客户端缓存,服务器将以这种或那种方式接收请求,并出现另一层缓存:您可以使用
    304命令使服务器响应
    
    [HttpGet]
    [ResponseCache(Duration = 120)]
    public IEnumerable<StateProvinceLookupModel> GetStateProvinces()
    {
        return _domain.GetStateProvinces();
    }