【发布时间】:2011-04-11 21:23:36
【问题描述】:
我有一个 ASP.Net 站点(恰好是 MVC,但在这里不相关),其中有几个页面我想缓存得很好。
具体我想实现:
- 输出缓存在服务器上 2 小时。
- 如果服务器上的文件内容发生变化,则应刷新该页面的输出缓存
- 在浏览器中缓存 10 分钟(即,甚至不询问服务器是否那么新鲜)
- 当浏览器确实发出实际的后续请求时,我希望它使用 etags,以便服务器可以在未修改的情况下返回 304。
(注意 - 以上时间值仅供参考)
- 1) 和 2) 我可以通过 Response.Cache.SetCacheability(HttpCacheability.Server) 实现
- 我知道 3) 可以通过使用 max-age 和 cache-control:private 来实现
- 我可以使用 Response.Cache.SetETagFromFileDependencies() 发出 etag;
但我似乎无法让所有这些东西一起工作。这是我所拥有的:
Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
Response.Cache.SetETagFromFileDependencies();
Response.Cache.SetValidUntilExpires(true);
Response.Cache.SetMaxAge(TimeSpan.FromSeconds(60 * 10));
我想要的场景可能吗?特别是:
- 浏览器可以像那样做 3) 和 4) 吗?当 Firefox 在本地缓存中过期后发出新请求时,它确实发送了服务器之前响应的 etag,但我得到了 200 响应。
- 像上面一样设置变量,我应该在哪里设置输出缓存的持续时间?
感谢您的任何提示!
【问题讨论】:
-
"Firefox ...确实发送了 etag" - 你的意思是在 If-None-Match 中?在这种特殊情况下,您是否使用
SetETagFromFileDependencies()手动发出 ETag? -
跟进,这是如何解决的?它究竟是如何失败的?
标签: asp.net asp.net-mvc caching http-headers outputcache