在ASP.Net MVC和IIS 7.5中设置最佳的http缓存头和服务器参数

Nik*_*Nik 18 asp.net asp.net-mvc caching outputcache http-headers

我有一个ASP.Net站点(碰巧是MVC,但这里没有关系),我想要缓存的几页很好.

具体来说,我想实现:

  1. 输出缓存在服务器上2个小时.
  2. 如果服务器上的文件内容发生更改,则应该为该页面刷新该输出缓存
  3. 在浏览器中缓存10分钟(即甚至不询问服务器是否新鲜)
  4. 当浏览器确实发出实际的后续请求时,我希望它使用etags,这样服务器如果没有修改就可以返回304.

(注意 - 以上时间值仅供参考)

  • 1)和2)我可以通过Response.Cache.SetCacheability(HttpCacheability.Server)来实现
  • 我知道3)可以通过使用max-age和cache-control实现:private
  • 我可以用Response.Cache.SetETagFromFileDependencies()发出etags;

但我似乎无法让所有这些东西一起工作.这就是我所拥有的:

    Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate);
        Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        Response.Cache.SetETagFromFileDependencies();
        Response.Cache.SetValidUntilExpires(true);
        Response.Cache.SetMaxAge(TimeSpan.FromSeconds(60 * 10));
Run Code Online (Sandbox Code Playgroud)

我想要的场景可能吗?特别是:

  • 浏览器可以同时执行3)和4)吗?当Firefox在本地缓存中过期后发出新请求时,它确实发送了服务器之前响应的etag,但我得到了200响应.
  • 设置上面的变量,我在哪里设置输出缓存的持续时间?

谢谢你的任何提示!

Eam*_*nne 1

我不确定你是否已经解决了这个问题(几个月后......),但这应该是可能的。

SetMaxAge应设置“保证”的新鲜时间量。如果您另外发送 ETag,您将满足 3 和 4。要求 1 和 2 可以通过您使用的任何服务器端缓存机制正交解决:我从来没有像这样使用过 ASP.NET 服务器端缓存,但是这几乎肯定是可能的。

我会从您的回复中删除无关的标头,例如SetRevalidation- 为什么这是必要的?