我希望能够为用户通过GET请求下载的某些项目设置较长的过期时间。
我想说'这有利于10分钟'(即我想设置一个Expires标头+10分钟)。请求是通过AJAX在页面中显示的HTML片段,它们对用户的会话很有用。 如果他们再次需要,我不想回到服务器并获得304 - 我希望浏览器缓存立即给我相同的项目。
我发现一篇关于MVC Action filter caching and compression的文章差不多一年了。这将创建一个自定义ActionFilter来更改过期标头。我已经在使用压缩过滤器,它对我正在生成的一些自定义css非常有用(压缩率为94%!)。
我有两个主要问题:
1)我真的必须使用这种方法吗?如果我这样做的话,我很好,但MVC或OutputCache功能中是否真的没有为我做这个功能?在'传统'ASP.NET中,我总是手动设置Expires头,但我们不能再这样做 - 至少不在控制器中。
2)如果我确实使用这种过滤方法 - 它是否会干扰OutputCache策略 - 我希望能够在web.config中控制它。我有点认为这两者是相互排斥的,你不会想要两者 - 但我不完全确定。
答案 0 :(得分:3)
不,您没有 使用此方法。但是,我认为它可能是最好的选择方法,因为它使控制器更易于测试,而且更少网络感知。另一种方法是在Controller中手动设置标题,如下所示:
Response.AddHeader(“Expires”,“Thu,1994年12月1日16:00:00 GMT”);
嗯,OutputCache属性控制动作何时运行,以及何时返回缓存的HTML。 Expires告诉浏览器何时重新获取HTML。所以我不会把它们称为互斥,但它们肯定是同一枚硬币的两面,你认为你可能不需要两者都是正确的。我建议您查看the HTTP spec以确定最适合您申请的内容。
答案 1 :(得分:2)
<强> Response.Expires 强> 此属性指定在浏览器中缓存的页面到期之前的分钟数,即。如果用户在指定的分钟数之前返回到同一页面,则显示页面的缓存版本。
<强> Response.ExpiresAbsolute 强> 使用此属性,我们可以设置浏览器中缓存的页面到期的日期和/或时间。
答案 2 :(得分:0)
听起来你只需要因用户而异:
http://aspadvice.com/blogs/ssmith/archive/2007/10/29/VaryByCustom-Caching-By-User.aspx
[OutputCache(Duration="10", VaryByCustom="username")]
的Global.asax:
public override string GetVaryByCustomString(HttpContext context, string key)
{
switch(key)
{
case "username":
return context.User.Identity.Name;
// Other VaryByCustom strategy implementations can go here.
}
return string.Empty;
}