Search code examples
asp.net-mvchttp-headerscassinietagwebdev.webserver

Why do my ETag headers work under IIS but not under the VS2010 web server?


In my ASP.NET MVC 2 app, I have the following lines:

Response.Cache.SetMaxAge(TimeSpan.FromDays(90));
Response.Cache.SetETag(lastWriteTime.Value.Ticks.ToString());

Using Fiddler to trace the HTTP streams, I can see:

ETag: 634473035667000000

in the Response Headers when running under IIS7, but when I'm running under the Visual Studio 2010 web server, this header just... disappears. Whether I set it via Response.Cache.SetETag() or via Response.AppendHeader("ETag", etag), it just never gets returned.

Is this a "feature" of the IIS web server? Is there some config setting I've missed? It's going to make testing cache invalidation a bit fiddly if I have to attach to the IIS process to be able to debug anything...

EDIT: It also appears that despite calling Response.Cache.SetCacheability(HttpCacheability.Public), VS/Cassini always returns resources with HTTP Cache-Control set to "private"... does that help?


Solution

  • The ETag will be suppressed if you use HttpCacheability.Private.

    You can find more information on Why does HttpCacheability.Private suppress ETags?

    If you change it to HttpCacheability.ServerAndPrivate it should work