2009-02-16 66 views
7

我希望能够为用户通过GET请求下载的某些项目设置很长的过期时间。如何最好地使用ASP.NET MVC中的Expires头文件?

我想说'这很好,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
  1. 不,你不使用此方法。不过,我认为这可能是最好的选择方法,因为它使控制器更易于测试,并且网络感知更少。另一种方法是在Controller中手动设置标题,如下所示:

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

  2. 好吧,OutputCache属性控制动作什么时候运行,什么时候它返回缓存的HTML。过期会告诉浏览器何时重新获取HTML。所以我不会把它们称为互斥,但它们肯定是同一枚硬币的两面,并且你认为你可能不需要两个都是可能是。我建议查看the HTTP spec来决定什么最适合您的应用程序。

+0

@craig感谢您的输入。我猜有关#2的一个经验法则是,如果生成的视图非常简单(即没有数据库访问),那么过期可能就是所需要的。如果需要十个Web方法调用,那么你会想使用OutputCache。有时你想正面和反面是正确的:-) – 2009-02-16 18:41:13

2

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

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

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

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; 
} 
相关问题