ASP.NET 中的缓存控制标头

Posted

技术标签:

【中文标题】ASP.NET 中的缓存控制标头【英文标题】:Cache-Control Headers in ASP.NET 【发布时间】:2010-10-31 01:28:08 【问题描述】:

我正在尝试为 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
-----
    为什么“Cache-Control”属性会显示两次? 我需要“Cache-Control”和“Expires”属性吗? “Page_Load”是放置此代码的最佳位置吗?

谢谢!

【问题讨论】:

【参考方案1】:

如果您将最大年龄设置得太远,您可能还需要添加此行:

// 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 Cache Control 行...您可能需要检查 IIS 是否已设置为自动添加标头。

【讨论】:

我遇到了同样的问题,在 IIS 中,您可以稍微精细地设置缓存标头,因此适用于整个站点、文件夹或单个文件。如果您想在 IIS (6) 中获得更多控制权,您可能还需要查看元数据库编辑器。【参考方案2】:

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

第二个问题:这取决于你想用缓存头实现什么。

我不知道你想用 max-age 达到什么目的。该值太高了,因为您将 DateTime 错误地转换为 TimeSpan。你为什么不直接使用 TimeSpan.FromMinutes 呢?

页面加载没问题。我通常自己在那里搞乱 HTTP 标头。

【讨论】:

以上是关于ASP.NET 中的缓存控制标头的主要内容,如果未能解决你的问题,请参考以下文章

asp.net中的GridView控制里的内容怎么样才能居中?

如何在 ASP.NET Core Web API 控制器中接收字节数组和标头内容

从 ASP.NET CORE Web Api 获取 React 中的特定响应标头(例如,Content-Disposition)

在 ASP.NET 中,对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头

Asp.Net Core:在控制器外使用内存缓存

从 ASP.NET Core 中的不同 HTTP 标头读取 JWT 令牌