【问题标题】:HTTP caching in WCF Web API seems inconsistent across browsersWCF Web API 中的 HTTP 缓存在浏览器中似乎不一致
【发布时间】:2012-02-18 00:28:03
【问题描述】:

我正在使用WCF Web API 实现一个简单的 REST 服务,并尝试设置 HTTP 标头以缓存响应。

对于这样的简单 GET

http://localhost:49302/my/2

响应标头如下所示:

Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 24 Jan 2012 18:18:44 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 233
Cache-Control: max-age=120
Vary: Accept
Expires: Tue, 24 Jan 2012 18:20:44 GMT
Last-Modified: Tue, 24 Jan 2012 18:18:15 GMT
Content-Type: application/xml; charset=utf-8

意图是客户端应该缓存资源两分钟。

但是,使用 WCF Web API 测试客户端时,不同浏览器的行为不一致:

  • 在 Firefox (9.0.1) 中,请求被缓存,两分钟后首先显示资源的新版本。这种行为符合预期。
  • 在 Chrome (16.0.912.77 m) 中,缓存标头根本不受尊重。正在为每个 GET 请求获取资源的新版本。这种行为不是预期的(至少是我)。
  • 在 Internet Explorer (9) 中的行为与在 Chrome 中相同。

为什么 Chrome 和 IE 不尊重缓存标头?

这是 WCF Web API 测试客户端中的错误吗?

【问题讨论】:

  • WCF Web API 测试客户端非常新,因此它可能存在错误。可以直接用浏览器测试还是写个小测试页。

标签: http rest cross-browser cache-control wcf-web-api


【解决方案1】:

缓存很难做到正确。浏览器可能会忽略缓存指令这一事实当然无济于事。

根据this document,IE 从未缓存过任何带有 Vary 标头的请求,其中除了 Accept-Encoding 和 User-Agent 之外的任何内容

如果我用 15 秒的缓存周期对此进行测试,并且我只是设置了 MaxAge 和 MustRevalidate,它似乎可以在 IE9、FireFox 和 Chrome 上正常工作。

Web API HttpResponseMessage:

result = new HttpResponseMessage<Book>(book);
result.Headers.CacheControl = new CacheControlHeaderValue();
result.Headers.CacheControl.MaxAge = TimeSpan.FromSeconds(15);
result.Headers.CacheControl.MustRevalidate = true;
return result;

响应标头:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 25 Jan 2012 09:13:32 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 98
Cache-Control: must-revalidate, max-age=15
Content-Type: application/json; charset=utf-8
Connection: Close

我不确定 MustRevalidate 是否真的需要,但建议使用它。请参阅规范here。

【讨论】:

  • 这是一个关于浏览器忽略缓存指令的非常有趣的见解。然而,即使我已经将我的标题剪裁到非常接近此处发布的标题,我仍然没有看到 Chrome 或 IE9 缓存响应。
  • 原来缓存指令只是一个提示,浏览器完全可以忽略它。使用 must-revalidate 是对浏览器更严格的提示,不确定有什么不同。我在 localhost 上进行测试,而不是使用测试客户端,而是使用带有 jQ​​uery $.getJSON() 调用的常规 HTML 页面上的按钮。
【解决方案2】:

测试将 localhost 替换为“真实域”,因此 WCF 测试客户端或 Chrome/IE 对 localhost 没有任何特殊技巧。

【讨论】:

  • 这实际上是一个非常合理的建议,因为我没有考虑过这一点,但可惜它没有任何区别。不过,我仍在本地机器上运行,但我尝试使用本地机器名称 (NETBIOS) 以及“完全限定”的类似 DNS 的名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2014-08-22
相关资源
最近更新 更多