I have a strange issue with IIS 7.
Sometimes it seems to return a 304 instead of a 200.
Here is a sample request captured with Fiddler:
(Note that the file requested is not located in my browsers cache yet.)
GET https://[mysite]/Content/js/jquery.form.js HTTP/1.1 Accept: */* Referer: https://[mysite]/Welcome/News Accept-Language: sv-SE User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E) Accept-Encoding: gzip, deflate Host: [mysite] Connection: Keep-Alive Cache-Control: no-cache Cookie: ...
Note that there is no If-Modified-Since or If-None-Match in the request.
But still the response is:
HTTP/1.1 304 Not Modified Cache-Control: public Expires: Tue, 02 Mar 2010 06:26:08 GMT Last-Modified: Mon, 22 Feb 2010 21:58:44 GMT ETag: "1CAB40A337D4200" Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET Date: Mon, 01 Mar 2010 17:06:34 GMT
Does anyone have a clue of what could be wrong here?
I'm running IIS 7 on Windows Web Server 2008 R2.
EDIT:
I've found a workaround, enable caching and then disable it on an extension level did the trick for me.
<configuration>
<system.webServer>
<caching enabled="true" enableKernelCache="true">
<profiles>
<add extension=".png" policy="DisableCache" kernelCachePolicy="DisableCache" />
<add extension=".gif" policy="DisableCache" kernelCachePolicy="DisableCache" />
<add extension=".js" policy="DisableCache" kernelCachePolicy="DisableCache" />
<add extension=".css" policy="DisableCache" kernelCachePolicy="DisableCache" />
</profiles>
</caching>
<staticContent>
<clientCache cacheControlMode="NoControl" />
</staticContent>
</system.webServer>
</configuration>
Best Answer
According to section 14.9 of the HTTP1.1 spec, the
no-cache
directive for the Cache-Control header is only imposable by the origin server, which means IIS is ignoring the header in your request.Section 14.9.1 defines
public
,private
, andno-cache
as the directives restricting what is cacheable, which can only be imposed by the server.If you don't want your .js file to be cached you'll either need to set the
no-cache
directive in the app (ie- the ASP.NET code) or you'll need to change theCache-Control
header in the request to use theno-store
directive instead ofno-cache
.EDIT:
Based on your comment - yes I assumed you did not want the file cached. The 304, then, might be coming as a result of the file being in one of IIS's internal caches. Have a look at these: