HTTP caching in WCF Web API seems inconsistent across browsers

I'm implementing a simple REST service with the WCF Web API and attempt to set HTTP headers in order to cache responses.

For a simple GET like this

http://localhost:49302/my/2

the response headers look like this:

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

The intent is that the client should cache the resource for two minutes.

However, using the WCF Web API Test Client, the behavior is inconsistent across various browsers:

  • In Firefox (9.0.1) the request is cached, and first after two minutes is a new version of the resource displayed. This behavior is as expected.
  • In Chrome (16.0.912.77 m) the cache headers aren't respected at all. A new version of the resource is being fetched for every GET request. This behavior is not expected (by me, at least).
  • In Internet Explorer (9) the behavior is the same as in Chrome.
  • Why doesn't Chrome and IE respect the cache headers?

    Is it a bug in the WCF Web API Test Client?


    Caching is hard to get right. The fact that a browser may ignore cache directives certainly doesn't help.

    According to this document IE never cached any request with a Vary header containing anything but Accept-Encoding and User-Agent

    If I test this with a 15 seconds cache period and I just set the MaxAge and MustRevalidate it seems to work fine with IE9, FireFox and 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;
    

    Response headers:

    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
    

    I am not sure the MustRevalidate is really required but it is recommended to use it. See the specs here.


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

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

    上一篇: 浏览器缓存HTTP 301多久?

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