IIS和静态内容?

时间:2013-01-08 09:37:03

标签: asp.net http caching iis-7 header

根据Ultra-Fast ASP.NET: Chapter 3 - Caching

  

浏览器从服务器检索的文件应存储在   浏览器的缓存尽可能地帮助最小化服务器   往返。

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

    只是图片,CSS,JS 而不是 ASPX,ashx ......?

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

  • 使用<%@ OutputCache标头声明页面(没有location)的场景怎么样?其中的imagesCSSJS源文件是否使用相同的属性进行缓存?

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

所以我这样做了:

Set Common HTTP Response Headers

但是稍后,在按下OK后,我找不到任何摘要菜单,其中显示了我:我已经将放入了响应标头(在这种情况:css文件夹)。

目前,为了看到css文件夹已应用了响应标头 - 我必须再次转到css文件夹 --> Http响应标头-->设置公共标头-->,然后我就看到它了。它不是在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>

2 个答案:

答案 0 :(得分:68)

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

第一个问题

  

但IIS如何知道什么是静态内容,什么是静态内容   不?

     

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

     

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

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

  • C:\的Windows \ Microsoft.NET \框架\ V2.0.50727 \ CONFIG \ web.config中
  • C:\的Windows \ Microsoft.NET \框架\ v4.0.30319 \配置\ web.config中

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

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

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

此示例使用的是<system.webServer>配置部分,因此适用于以集成模式运行的应用池。

第二个问题

  

使用&lt;%@声明页面的情况怎么样?   OutputCache标头(没有位置)。做图像,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)

Apparently these settings are saved in C:\ Windows \ System32 \ inetsrv \ config \ applicationHost.config

我现在没有IIS7并在IIS 7.5上亲自开发。所以如果你能确认这个位置是准确的,请发表评论!

答案 1 :(得分:4)

  1. 静态内容是IIS被读取并发送到浏览器而不进行任何处理的内容。在那里,您可以设置IIS以包含一些Cache-Control Header以在客户端浏览器计算机上缓存它。
  2. 如你所说,你可以通过直接设置IIS,web.config上的命令来执行以太操作。您在web.config上添加并关注IIS的命令与asp.net本身无关,但IIS和IIS将其配置保存在不同的文件中,因此当您直接更改缓存控件头时你没有在web.config上看到它们的IIS。
  3. 现在提供静态内容,例如图片,CSS,JavaScript和其他类似文件they say that you can follow the "never expire" policy by adding 10 years expire.
  4. 这里的问题是,如果您无法更改静态文件的内容,例如,如果您缓存了10年的javascript文件,并对其进行了小的更改,那么您需要使用ether来更改文件名,ether在其末尾添加一些参数。
  5. 现在控件上的<%@ OutputCache被引用到服务器缓存而不是客户端,实际上做的是在服务器上缓存控件的渲染,以便下次你不要求它浪费时间再次渲染它但是从缓存中读取它 - 仍然将它发送到浏览器。
  6. 您还可以阅读以下答案:What are difference between IIS (Dynamic and Static) cache,OutPutCache and browser cache