49

根据Ultra-Fast ASP.NET:第 3 章 - 缓存

浏览器从服务器检索的文件应尽可能长时间地存储在浏览器的缓存中,以帮助最大程度地减少服务器往返次数。

  • 但是 IIS 是如何知道静态内容实际上是什么以及不是什么?

    它只是图像、CSS、JS而不是ASPX、ashx ......?

    我在 IIS 中哪里可以看到什么已经被认为是静态的,什么不是

  • 如果页面已声明为<%@ OutputCacheheader(不带location),情况会怎样?它内部的images,CSSJS源文件是否以相同的属性缓存输出?

  • 作为最佳实践,我应该将未来一年设置为最长到期时间。我应该使用它作为网站上所有静态内容的默认值

所以我这样做了:

设置通用 HTTP 响应标头

但后来,按 后OK,我找不到任何显示我的摘要菜单:我已经向谁放置了响应头(在本例中:css文件夹)。

目前,为了看到该文件夹​​已应用响应标头 - 我必须再次css转到该css文件夹​​ Http Response Header Set Common Headers然后我看到它。它没有写在 web.config 中。 -->-->-->

但是,如果我为文件(Login.aspx例如)执行此操作:我确实在 web.config 中看到了它:

<configuration>
    <location path="Login.aspx">
        <system.webServer>
            <staticContent>
                <clientCache cacheControlMode="UseExpires" cacheControlMaxAge="1.00:00:00" httpExpires="Fri, 15 Feb 2013 00:00:00 GMT" />
            </staticContent>
        </system.webServer>
    </location>
</configuration>
4

2 回答 2

75

我理解你的情况。有时它会混淆 IIS 如何处理文件。IIS 6 与 IIS 7 也不同,经典应用程序池和集成模式应用程序池也不同。我的经验主要是使用 IIS 7.5 上的集成应用程序池,所以这是我可以最准确地评论的环境。

第一个问题

但是 IIS 怎么知道什么是静态内容,什么不是呢?

它只是 images , css , js 而不是 ASPX , ashx ......?

我在 IIS 中哪里可以看到什么已经被认为是静态的,什么不是?

您可以通过导航到您的网站来检查 IIS 中的文件处理程序列表,然后单击“处理程序映射”。默认情况下,这些是从 .Net 基础 web.config 继承的,该基础 web.config 位于不同的位置,具体取决于您的 .Net 框架版本。

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\web.config

如果所请求的文件尚未显式映射到另一个处理程序,则它属于一个捕获所有处理程序 ( *) 作为最后一个选项 ( System.Web.DefaultHttpHandler),该选项确定它是静态文件还是目录浏览请求。所以静态文件只是没有绑定到另一个处理程序的文件。例如,您会看到在此默认处理程序之前*.aspx已经映射到。System.Web.UI.PageHandlerFactory因此它将由该处理程序处理,而不是被视为静态文件。如果您删除了该映射,您可以在技术上将 *.aspx 作为静态文件提供(如果您真的想要)(只是为了证明它是如何工作的)。

System.Web.StaticFileHandler但是您也可以通过在 web.config 的 httpHandlers 部分中添加一个条目,将文件扩展名映射到IIS 中,从而将文件类型显式列为静态文件。例如:

<configuration>
  <system.webServer>
    <handlers>
      <add name="StaticHandler" verb="*" path="*.zip" type="System.Web.StaticFileHandler" preCondition="integratedMode" />
    </handlers>
  </system.webServer>
</configuration>

此示例使用config 部分,因此它适用于以集成模式<system.webServer>运行的应用程序池。

第二个问题

使用 <%@ OutputCache header(without location) 声明页面的情况如何。里面的图像、css、js src 文件是否也使用相同的属性缓存输出?

不,因为页面作为单独的请求(甚至可能由单独的处理程序)作为服务器,它可以具有完全不同的缓存标头/提示。从缓存的角度来看,主机页面和它可能使用的资源是不相关的。

事实上,您甚至可能希望 *.html 的缓存期更短,*.jpg 或 *.png 的缓存期更长?需要考虑的事情。

第三个问题

作为最佳实践,我应该将未来一年设置为最长到期时间。我应该将其用作网站上所有静态内容的默认值

嗯......我可能不会去一年。一个月怎么样?我会制定这样的全球政策:

<configuration>
  <system.webServer>
    <staticContent>
      <!-- Set expire headers to 30 days for static content-->
      <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
    </staticContent>
  </system.webServer>
</configuration>

这与您在上面显示的示例相同,但不在<location>元素内,而是在根<configuration>元素中,因此它是默认策略。这同样适用于以集成模式运行的应用程序池。有时还需要开启:

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <!-- stuff -->
        </modules>
    </system.webServer>
<system.webServer>

这只是确保通过尊重上述配置元素的托管静态文件处理程序处理静态文件。

编辑地址评论

您在上面发布的配置对话框的文档位于此处:Configure the HTTP Expires Response Header (IIS 7)

显然这些设置保存在C:\Windows\System32\inetsrv\config\applicationHost.config

我没有 IIS7,现在个人在 IIS 7.5 上开发。因此,如果您可以验证此位置是否准确,请发表评论!

于 2013-01-11T01:15:42.557 回答
4
  1. 静态内容是 IIS 读取并发送到浏览器而无需任何处理的内容。在那里,您可以设置 IIS 以包含一些Cache-Control Header以将其缓存在客户端浏览器计算机上。
  2. 您可以通过直接设置 IIS 来完成该操作,web.config如您所说,通过命令进行操作。您在 web.config 上添加并涉及 IIS 的命令与 asp.net 本身无关,但 IIS 和 IIS 将他的配置保存在不同的文件中,因此当您更改缓存控制标头时直接在IIS 你在 web.config 上看不到它们。
  3. 现在,对于图像、CSS、JavaScript 和其他类似文件等静态内容,他们说您可以通过添加 10 年到期来遵循“永不过期”政策。
  4. 这里的问题是,如果您不能更改静态文件的内容,例如,如果您缓存一个 10 年的 javascript 文件,并且您对其进行了小的更改,那么您需要 ether 更改文件名,ether 到在它的末尾添加一些参数。
  5. 现在,<%@ OutputCache控件上的控件被引用到服务器缓存而不是客户端,实际上所做的是将控件的渲染缓存在服务器上,以便下次您要求它不要浪费时间再次渲染它但读取它来自缓存 - 仍将其发送到浏览器。

您还可以阅读此答案以了解更多信息:IIS(动态和静态)缓存、OutPutCache 和浏览器缓存之间有什么区别

于 2013-01-08T10:25:34.170 回答