ASP.NET中的缓存控制头信息

28

我正在尝试为Web应用程序设置缓存控制头(看起来我能够做到),但我在头部响应中得到了我认为是奇怪的条目。我的实现如下:

    protected override void OnLoad(EventArgs e)
    {
        // Set Cacheability...
        DateTime dt = DateTime.Now.AddMinutes(30);
        Response.Cache.SetExpires(dt);
        Response.Cache.SetMaxAge(new TimeSpan(dt.ToFileTime()));

        // Complete OnLoad...
        base.OnLoad(e);
    }

这是头部响应所显示的内容:

-----
GET /Pages/Login.aspx HTTP/1.1
Host: localhost:1974
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-lori-time-1: 1244048076221
Cache-Control: max-age=0

HTTP/1.x 200 OK
Server: ASP.NET Development Server/8.0.0.0
Date: Wed, 03 Jun 2009 16:54:36 GMT
X-AspNet-Version: 2.0.50727
Content-Encoding: gzip
Cache-Control: private, max-age=31536000
Expires: Wed, 03 Jun 2009 17:24:36 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 6385
Connection: Close
-----
  1. "Cache-Control"属性为什么会出现两次?
  2. 我需要同时使用"Cache-Control"和"Expires"属性吗?
  3. "Page_Load"是放置这段代码的最佳位置吗?

谢谢!

2个回答

23

如果您设置的最大年龄很长,您可能还想添加以下这行代码:

// Summary:
// Sets Cache-Control: public to specify that the response is cacheable
// by clients and shared (proxy) caches.    
Response.Cache.SetCacheability(HttpCacheability.Public);

我经常使用文件处理程序来处理从数据库中保存的文件的请求,并对文档和图像进行响应头的操作。

根据你的目的,你可以强制浏览器在本地缓存几乎所有页面数天(如果这是你想要/需要的)。

编辑:

我认为您可能设置了错误的最大年龄...

Response.Cache.SetMaxAge(new TimeSpan(dt.Ticks - DateTime.Now.Ticks ));

这行代码是设置本地浏览器的缓存时间为30分钟 [max-age=1800]

至于两个缓存控制行...您可能需要检查一下是否已经设置IIS自动添加了头信息。


1
我曾经也遇到过同样的问题,在IIS中,你可以设置缓存头的粒度,例如针对整个站点、一个文件夹或者单个文件。如果你想在IIS(6)中获得更多的控制权,你可能还需要查看Metabase编辑器。 - Gyuri

12

我没有看到“Cache-control”出现两次。一个在请求中,一个在响应中。请求中的那个可能是因为你在浏览器中按了Shift+F5或类似的操作。

对于你的第二个问题:这取决于你想通过缓存头部实现什么目标。

我不知道你想用max-age实现什么。该值太高了,因为你错误地将DateTime转换为TimeSpan。为什么不使用TimeSpan.FromMinutes呢?

页面加载得很好。我通常会自己搞定HTTP头部。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接