Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 371
Mark Seemann Avatar asked Jan 24 '12 18:01

Mark Seemann


1 Answers

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.

like image 84
Maurice Avatar answered Oct 23 '22 03:10

Maurice