Question

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?

Was it helpful?

Solution

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.

OTHER TIPS

Test to replace localhost with "real domain" so the WCF Test Client or Chrome/IE doesnt have any special tricks for localhost.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top