IIS 7 返回 304 而不是 200

Ola*_*ahl 11 windows-server-2008 iis-7 asp.net

我对 IIS 7 有一个奇怪的问题。
有时它似乎返回 304 而不是 200。

这是使用 Fiddler 捕获的示例请求:(
请注意,请求的文件尚未位于我的浏览器缓存中。)

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: ...
Run Code Online (Sandbox Code Playgroud)

请注意,请求中没有 If-Modified-Since 或 If-None-Match。
但还是得到了回应:

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
Run Code Online (Sandbox Code Playgroud)

有没有人知道这里可能有什么问题?

我在 Windows Web Server 2008 R2 上运行 IIS 7。

编辑:

我找到了一种解决方法,启用缓存然后在扩展级别禁用它对我来说是个窍门。

<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>
Run Code Online (Sandbox Code Playgroud)

squ*_*man 3

根据HTTP1.1 规范第 14.9 节no-cacheCache-Control 标头的指令只能由源服务器强制执行,这意味着 IIS 会忽略您请求中的标头。

缓存控制指令可以分为以下几类:

  - Restrictions on what are cacheable; these may only be imposed
Run Code Online (Sandbox Code Playgroud)

由源服务器。

第 14.9.1 节定义publicprivate、 和no-cache作为限制可缓存内容的指令,这些指令只能由服务器强制执行。

如果您不希望缓存 .js 文件,则需要no-cache在应用程序中设置指令(即 ASP.NET 代码),或者需要更改Cache-Control请求中的标头以使用该no-store指令代替no-cache

编辑:
根据您的评论 - 是的,我假设您不希望缓存该文件。那么,304 可能是由于该文件位于 IIS 的内部缓存之一中而导致的。看看这些: