WCF Web API中的HTTP缓存在浏览器中似乎不一致

我正在使用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米)中,缓存标头完全不受尊重。 每个GET请求都会获取新版本的资源。 这种行为是没有预料到的(至少我是这样)。
  • 在Internet Explorer(9)中,行为与Chrome中的行为相同。
  • 为什么Chrome和IE不尊重缓存头?

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


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

    根据这个文档,IE从不缓存任何包含除Accept-Encoding和User-Agent以外的任何Vary头的请求

    如果我用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是否真的需要,但建议使用它。 看到这里的规格。


    测试用“真正的域”替换本地主机,所以WCF测试客户端或Chrome / IE没有任何本地主机的特殊技巧。

    链接地址: http://www.djcxy.com/p/55741.html

    上一篇: HTTP caching in WCF Web API seems inconsistent across browsers

    下一篇: Force Browser Caching Across Browser Sessions