为什么我的HTTP缓存标头不起作用?

时间:2012-09-27 04:06:09

标签: .net http httpwebrequest http-caching

我最近在我的一些网络服务响应中添加了一些HTTP缓存标头,但到目前为止他们还没有为我在客户端做任何事情。以下是其中一个回复:

HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Transfer-Encoding: chunked
Content-Type: application/vnd.com...
Expires: Thu, 27 Sep 2012 03:40:27 GMT
Server: Microsoft-IIS/7.5
Set-Cookie: DDRSSID=...
X-DDVS-Version: 1.0.0.0
X-Powered-By: ASP.NET
Date: Thu, 27 Sep 2012 03:40:22 GMT

根据Fiddler和REDbot的说法,这个响应应该是完全可缓存的。这就是Fiddler所说的:

  

public:任何缓存都可以缓存此响应   max-age:此资源将在1分钟后过期。 [60秒]

即便如此,回复并非来自缓存:我在Fiddler中看到它们,而IsFromCache上的HttpWebResponse属性为 false 。这是我的请求的内容,fwiw:

GET http://floater/rest/folders/folder.20 HTTP/1.1
Accept: application/vnd.com....
Authorization: Basic blahblah
Host: floater

我错过了什么?

1 个答案:

答案 0 :(得分:1)

事实证明我的标题没有任何问题。相反,问题是HttpWebRequest的默认缓存策略是而不是 HttpRequestCacheLevel.Default。我猜不好。

通过在我的请求初始化中添加以下行,我能够看到我期望的缓存结果:

webRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);

我在各方面测试时遇到的另一个问题是,除非您阅读整个响应(例如,通过阅读GetResponseStream()的末尾),否则不会缓存响应。值得庆幸的是,文档中提到了这一点:

  

如果检索到资源的响应流并将其读取到流的末尾,则只会将资源的副本添加到缓存中。

相关问题