LP1*_*P13 17 asp.net-core-mvc coreclr asp.net-core asp.net-core-1.0
在ASP.NET Core应用程序中,我有一个返回一些数据的action方法.我想在客户端缓存这些数据.所以根据这里的文档,我可以使用ResponseCacheaction方法的属性.此属性Cache-Control在响应中添加标头
响应缓存是指在ASP.NET Core MVC操作所做的HTTP响应上指定与缓存相关的标头.这些标头指定了您希望客户端和中间(代理)计算机如何缓存对某些请求的响应(如果有的话).这可以减少客户端或代理对Web服务器的请求数,因为可以从客户端或代理的缓存提供对相同操作的未来请求.
也
响应缓存不会缓存Web服务器上的响应.它与输出缓存不同,后者会在早期版本的ASP.NET和ASP.NET MVC中缓存服务器内存中的响应.
所以这就是我的动作方法的样子
public class LookupController : Controller
{
[HttpGet]
[ResponseCache(Duration = 120)]
public IEnumerable<StateProvinceLookupModel> GetStateProvinces()
{
return _domain.GetStateProvinces();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用浏览器调用方法http:// localhost:40004/lookup/getstateprovinces 这是请求和响应头
请注意,响应标头Cache-Control: public,max-age-120符合预期.但是,如果使用F5刷新页面(120秒之前),则GetStateProvince操作方法中的调试器断点总是会命中.这意味着它不会破坏客户端的数据.
我还需要做些什么来启用客户端缓存吗?
更新 我尝试过使用IE,Chrome和POSTMAN但没有运气.每次我在地址栏中输入网址或点击刷新时,客户端(即浏览器或邮递员)都会调用操作方法.
Mic*_*ael 12
实际上,ResponseCache属性按预期工作.
不同之处在于,如果您浏览网站页面(案例1),或使用后退和前进按钮(而不是刷新页面时),则会缓存响应.
作为案例1的一个例子,我有以下内容:
正如您将在ASP.Net Core 1.1中的Response Caching一文中看到的那样,如下所示:
在浏览器会话期间,浏览网站内的多个页面或使用后退和前进按钮访问页面,内容将从本地浏览器缓存(如果未过期)提供.
但是当页面通过F5刷新时,请求将转到服务器,页面内容将刷新.您可以使用F5通过刷新联系页面进行验证.
因此,当您点击F5时,响应缓存到期值无法发挥作用来提供内容.您应该看到200个联系请求响应.
参考文献:
[1].ASP.NET核心响应缓存示例
[2].ResponseCache属性示例
[3]:如何在所有浏览器中控制网页缓存?
长话短说,使用如下ResponseCache属性足以让基于到期的客户端缓存在全新的默认 dotnet 核心项目(包括async方法)中工作:
[HttpGet]
[ResponseCache(Duration = 120)]
public IEnumerable<StateProvinceLookupModel> GetStateProvinces()
{
return _domain.GetStateProvinces();
}
Run Code Online (Sandbox Code Playgroud)
这在上面的屏幕截图中工作正常,因为在Cache-Control: public,max-age=120那里可见。在大多数情况下,浏览器不会在到期前(即接下来的 120 秒或 2 分钟)发送后续请求,但这是浏览器(或其他客户端)的决定。
如果请求时,无论发送,你要么有一些中间件或服务器配置覆盖你的响应头,或您的客户端忽略缓存指令。在上面的截图中,客户端忽略了缓存,因为缓存控制头在那里。
客户端缓存被忽略并发送请求的常见情况:
Cache-Control: no-cacheCache-Control: max-age=0(这在您的屏幕截图中可见)Cache-Control: no-cache头部,使其绕过本地缓存,导致请求被发送;您可以从设置对话框中禁用它,在这种情况下,将不再使用上述客户端缓存配置发送请求在这一点上,我们已经超越了基于过期的客户端缓存,服务器会以某种方式接收请求,并且会发生另一层缓存:您可以让服务器用304 Not Modified代码进行响应(然后再次由客户端决定)以它想要的任何方式进行解释)或使用服务器端缓存并以完整内容进行响应。或者您可能不使用任何后续缓存,而只是在服务器上再次执行整个请求处理。
注意:该ResponseCache属性在启动配置中不要与services.AddResponseCaching()&app.UseResponseCaching()中间件混淆,因为它用于服务器端缓存(默认情况下使用内存缓存,当使用中间件时)。客户端缓存工作不需要中间件,属性本身就足够了。
首先我想澄清几件事,我相信你已经知道了。
ResponseCache 无论如何都不等于OutputCache。
ResponseCache 按照我的想法设置标头,但它不会在服务器端缓存任何内容。
现在,如果您想像 OutputCache 一样进行缓存,那么您可能必须使用刚刚发布的预览版 1.1。
ASP.net core 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
| 归档时间: |
|
| 查看次数: |
6320 次 |
| 最近记录: |