如何最好地使用ASP.NET MVC中的Expires头?

Sim*_*ver 7 asp.net-mvc outputcache

我希望能够为用户通过GET请求下载的某些项目设置很长的到期时间.

我想说'这有利于10分钟'(即我想设置一个Expires标头+10分钟).请求是通过AJAX在页面中显示的HTML片段,它们对用户的会话很有用.我不想回到服务器并获得304,如果他们再次需要它们 - 我希望浏览器缓存立即给我相同的项目.

我发现了一篇关于MVC Action过滤器缓存和压缩的文章已有近一年的历史.这将创建一个自定义ActionFilter来更改过期标头.我已经在使用压缩过滤器,它对我正在生成的一些自定义css非常有效(压缩率为94%!).

我有两个主要问题:

1)我真的必须使用这种方法.如果我这样做的话,我很好,但MVC或OutputCache功能中是否真的没有为我做这个功能?在'传统'ASP.NET中,我总是手动设置Expires头,但我们不能再这样做了 - 至少在控制器中不行.

2)如果我使用这种过滤方法 - 是否会干扰OutputCache策略 - 我希望能够在web.config中控制它.我有点认为这两者是相互排斥的,你不会想要两者 - 但我不完全确定.

Cra*_*ntz 3

  1. 不,您不必使用此方法。然而,我认为这可能是最好的选择方法,因为它使控制器更易于测试并且更少的网络感知。另一种方法是在控制器中手动设置标头,如下所示:

    Response.AddHeader("过期", "1994 年 12 月 1 日星期四 16:00:00 GMT");

  2. 那么,OutputCache 属性控制操作何时运行,以及何时返回缓存的 HTML。Expires 告诉浏览器何时重新获取 HTML。所以我不会称它们是相互排斥的,但它们肯定是同一枚硬币的两面,你认为你可能不需要两者都是正确的。我建议查看HTTP 规范来决定什么最适合您的应用程序。

  • 考虑一下:如果 10 个人(在不同的计算机上)每人请求您的页面 10 次,则过期本身意味着您的操作运行 10 次并且服务器处理 10 个请求。单独缓存意味着您的操作运行一次并且服务器处理 100 个请求。过期和缓存一起意味着您的操作运行一次并且服务器处理 10 个请求。 (3认同)