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

时间:2009-02-16 09:21:17

标签: asp.net-mvc outputcache

我希望能够为用户通过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中控制它。我有点认为这两者是相互排斥的,你不会想要两者 - 但我不完全确定。

3 个答案:

答案 0 :(得分:3)

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

    Response.AddHeader(“Expires”,“Thu,1994年12月1日16:00:00 GMT”);

  2. 嗯,OutputCache属性控制动作何时运行,以及何时返回缓存的HTML。 Expires告诉浏览器何时重新获取HTML。所以我不会把它们称为互斥,但它们肯定是同一枚硬币的两面,你认为你可能不需要两者都是正确的。我建议您查看the HTTP spec以确定最适合您申请的内容。

答案 1 :(得分:2)

<强> Response.Expires 此属性指定在浏览器中缓存的页面到期之前的分钟数,即。如果用户在指定的分钟数之前返回到同一页面,则显示页面的缓存版本。

<强> Response.ExpiresAbsolute 使用此属性,我们可以设置浏览器中缓存的页面到期的日期和/或时间。

http://forums.asp.net/t/1532229.aspx

答案 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;
}