首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ResponseCache属性不在客户端缓存数据。

ResponseCache属性不在客户端缓存数据。
EN

Stack Overflow用户
提问于 2016-11-01 21:42:13
回答 3查看 14.3K关注 0票数 25

在ASP.NET核心应用程序中,我有一个返回一些数据的操作方法。我想将这个数据缓存到客户端上。因此,基于这里的文件,我可以在action方法上使用ResponseCache属性。此属性在响应中添加Cache-Control头。

响应缓存是指在HTTP操作生成的ASP.NET响应上指定与缓存相关的头部。这些标头指定您希望客户机和中间(代理)机器如何缓存对某些请求的响应(如果有的话)。这可以减少客户机或代理向web服务器提出的请求的数量,因为将来对相同操作的请求可能会从客户机或代理的缓存中处理。

也是

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

这就是我的动作方法

代码语言:javascript
复制
public class LookupController : Controller
{
    [HttpGet]
    [ResponseCache(Duration = 120)]
    public IEnumerable<StateProvinceLookupModel> GetStateProvinces()
    {
        return _domain.GetStateProvinces();
    }
}

然后我使用浏览器调用这个方法,因为http://localhost:40004/lookup/getstateprovinces是请求和响应头

注意,响应头的Cache-Control: public,max-age-120与预期的一样。但是,如果使用F5刷新页面( 120秒前),则GetStateProvince操作方法中的调试器断点总是会命中。这意味着它不会在客户端发布数据。

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

更新我尝试使用IE,Chrome和邮递员,没有运气。每次我在地址栏中键入url或按下刷新时,客户端(即浏览器或邮递员)都会调用action方法。

EN

回答 3

Stack Overflow用户

发布于 2017-01-16 12:20:35

实际上,ResponseCache属性按预期工作。

不同之处在于,如果您浏览网站页面(case 1)或使用后退和转发按钮(而不是刷新页面时),则响应将被缓存。

作为case 1的一个示例,我有以下内容:

  • 你在http://localhost:65060/Home/Index页面上
  • 键入另一个url,然后单击“进入”或单击网页中的链接:http://localhost:65060/Home/Users
  • 再次键入url http://localhost:65060/Home/Index (您将看到这一次这个url的响应从磁盘缓存中获取)

正如您将在文章ASP.Net Core1.1中的响应缓存中看到的那样,本文将说明以下内容:

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

参考文献:

1. ASP.NET核心响应缓存示例

2. ResponseCache属性样本

3:如何控制网页缓存,跨越所有浏览器?

票数 20
EN

Stack Overflow用户

发布于 2019-01-02 13:00:16

长话短说,像下面这样使用ResponseCache属性就足以使基于到期的客户端缓存在全新的默认dotnet核心项目(包括async方法)中工作:

代码语言:javascript
复制
[HttpGet]
[ResponseCache(Duration = 120)]
public IEnumerable<StateProvinceLookupModel> GetStateProvinces()
{
    return _domain.GetStateProvinces();
}

在上面的屏幕截图中,这是正确的,因为Cache-Control: public,max-age=120在那里是可见的。在大多数情况下,浏览器不会在过期前发送后续请求(即接下来的120秒或2分钟),但这是浏览器(或其他客户端)的决定。

如果不管发送请求,您要么有一些中间件或服务器配置覆盖您的响应头,要么您的客户端忽略了缓存指令。在上面的截图中,客户端忽略缓存,因为缓存控制头就在那里。

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

  • 当使用HTTPS时没有证书(或者无效的证书,这在本地开发中通常是常见的,所以在测试缓存时一定要使用防止,或者信任自签名证书)。
  • 大多数浏览器开发工具在打开时默认禁用缓存,这可以禁用。
    • 浏览器通常发送额外的标题,Chrome发送Cache-Control: no-cache

  • 直接刷新(即Ctrl+F5)将指示大多数浏览器不使用缓存并发出请求,而不考虑年龄的
    • 浏览器通常发送额外的标题,Chrome发送Cache-Control: max-age=0 (这在屏幕截图中是可见的)

  • Postman发送Cache-Control: no-cache报头,使其绕过本地缓存,从而导致发送请求;您可以从“设置”对话框禁用它,在这种情况下,将不再使用上述客户端缓存配置发送请求。

此时,我们已经超越了基于过期的客户端缓存,服务器将以某种方式接收请求,并发生另一层缓存:您可以让服务器使用304 Not Modified代码进行响应(这再次取决于客户机以它想要的方式进行解释),或者使用服务器端缓存并使用完整的内容进行响应。或者,您可能不会使用任何后续缓存,只需在服务器上再次执行整个请求处理。

注意:在启动配置中,ResponseCache属性不应与services.AddResponseCaching() & app.UseResponseCaching()中间件混淆,因为这是用于服务器端缓存(默认情况下,在使用中间件时使用内存缓存)。客户端缓存不需要中间件来工作,属性本身就足够了。

票数 7
EN

Stack Overflow用户

发布于 2016-11-02 10:21:05

首先,我不想澄清什么,我相信你已经知道了。

  1. 无论如何,ResponseCache并不等于OutputCache。
  2. ResponseCache和我的思维集头一样,但是它不会在服务器端缓存任何东西。

现在,如果您希望缓存与OutputCache相同,那么您可能必须使用预览版本1.1,即刚刚发布的版本。

ASP.net核心1.1预览版

https://blogs.msdn.microsoft.com/webdev/2016/10/25/announcing-asp-net-core-1-1-preview-1/

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

这里有它的演示。https://github.com/aspnet/ResponseCaching/blob/dev/samples/ResponseCachingSample/Startup.cs

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40369112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档