【发布时间】:2017-03-15 03:01:19
【问题描述】:
在 ASP.NET Core 应用程序中,我有一个返回一些数据的操作方法。我想在客户端缓存这些数据。所以基于documentation here 我可以在操作方法上使用ResponseCache 属性。此属性在响应中添加Cache-Control 标头
响应缓存是指在 HTTP 上指定缓存相关的 headers 由 ASP.NET Core MVC 操作做出的响应。这些标题指定如何 您希望客户端和中间(代理)机器缓存响应 某些请求(如果有的话)。这可以减少数量 请求客户端或代理向 Web 服务器发出请求,因为将来 相同动作的请求可以从客户端或代理的 缓存。
还有
响应缓存不会在 Web 服务器上缓存响应。它 与输出缓存不同,后者会将响应缓存在内存中 ASP.NET 和 ASP.NET MVC 早期版本中的服务器。
这就是我的操作方法的样子
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 和 POSTMAN,但没有成功。每次我在地址栏中输入 url 或点击刷新时,客户端(即浏览器或邮递员)都会调用操作方法。
【问题讨论】:
-
@dotnetstep 是对的,据我所知,f5(refresh page) 已经是客户端的缓存代理。只需在地址栏中输入地址并输入。那就是我检查缓存的方式
-
@ergen 我也尝试过使用 POSTMAN,但没有成功
-
我不知道邮递员是谁。让我们澄清一下:尝试简单地转到浏览器上的 url 而不是刷新。刷新是代理,其次文件类型对于客户端缓存很重要。例如,您不会缓存 1000 mb 视频。你只缓存一个.json,所以没关系。那么,我确信当你使用像 licalhost/lookup/getstateprovinces.json 这样的 url 时,你的缓存会起作用。专注于客户端的扩展和可缓存文件。即使您在响应中添加标头,由于扩展名,浏览器也可能不知道您的文件是静态文件
-
我为什么要使用文件类型?它是一种动作方法。您永远不会将操作方法称为
http://localhost/lookup/getstateprovinces.json。顺便说一句,这里是邮递员getpostman.com -
我没有说你应该使用文件类型。我说过,当您提供扩展名时,您会看到您的缓存会起作用。我建议你确保你的 _domain.GetStateProvinces();方法返回一个带有 .json 扩展名的有效 json。它只是一个结果,甚至不是没有扩展名的文件。认为您提供一个 .aspx 页面并命令浏览器缓存所有扩展名为 .aspx 的文件。摘要:尝试添加类似扩展或 mimetype 的东西(这取决于 your_domain.GetStateProvinces(); 方法返回的内容和方式),看看它是否有效
标签: asp.net-core asp.net-core-mvc asp.net-core-1.0 coreclr