ASP.NET中的缓存控制标头

时间:2009-06-03 17:07:18

标签: c# asp.net caching header

我正在尝试为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”是放置此代码的最佳位置吗?
  4. 谢谢!

2 个答案:

答案 0 :(得分:22)

如果要设置最远的最大年龄,您可能还想添加此行:

// 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]

对于2x缓存控制行...您可能需要检查IIS是否已设置为自动添加标题。

答案 1 :(得分:12)

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

关于第二个问题:这取决于您希望使用缓存标头实现的目标。

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

页面加载没问题。我自己经常乱用HTTP标头。