IIS和静态内容?

根据超快速ASP.NET:第3章 – caching :

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

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

    它只是图像,CSS,JS 而不是 ASPX,ashx …?

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

  • 如何使用<%@ OutputCache标头声明页面(没有location )? 其中的imagesCSSJS源文件被输出caching具有相同的属性?

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

所以我这样做了:

设置通用HTTP响应头

但后来,按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> 

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

第一个问题

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

它只是图像,CSS,JS,而不是ASPX,ashx …?

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

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

  • C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ CONFIG \ web.config中
  • C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319 \ CONFIG \ web.config中

如果被请求的文件还没有被显式映射到另一个处理程序,则它将作为最后一个选项( System.Web.DefaultHttpHandler )来确定它是静态文件还是目录浏览请求。 所以静态文件只是文件没有绑定到另一个处理程序已经。 例如,你会看到*.aspx已经映射到System.Web.UI.PageHandlerFactory之前,这个默认的处理程序。 所以它将被该处理程序处理,不被视为静态文件。 如果你删除了这个映射,你可以在技术上把* .aspx作为一个静态文件,如果你真的想要(只是为了certificate它的工作原理)。

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

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

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

第二个问题

如何使用<%@ OutputCache头部(没有位置)声明一个页面。 它的图像,CSS,JS SRC文件里面,也被输出caching具有相同的属性?

没有。因为这个页面是作为一个单独的请求服务器(甚至可能是一个单独的处理程序),它可以有完全不同的caching标题/提示。 主机页面及其可能使用的资源与cachingangular度无关。

实际上,您甚至可能希望为* .html创build一个较短的caching周期,为* .jpg或* .png创build一个较长的caching周期。 有些事情要考虑。

第三个问题

作为一个最好的办法,我应该设置一个未来的最大到期时间。我应该使用它作为网站上所有静态内容的默认值

嗯…我可能不会走一年。 一个月怎么样? 我会设定一个像这样的全球政策:

 <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> 

这只是确保静态文件通过尊重上述configuration元素的托pipe静态文件处理程序进行处理。

编辑到地址评论

上面发布的configuration对话框的文档位于以下位置: configurationHTTP过期响应头(IIS 7)

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

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

  1. 静态内容是IIS无需任何处理就可以读取并发送到浏览器的内容。 在那里,您可以设置IIS以包含一些Cache-Control Headercaching在客户端浏览器计算机上。
  2. 您可以通过直接设置IIS来执行以太网,如您所说,可以通过web.config的命令来实现。 你在web.config上添加的关于IIS的命令,并不是与asp.net自己做的,而是IIS和IIS把他的configuration保存在一个不同的文件上,所以当你直接改变caching控制头时IIS在web.config上没有看到它们。
  3. 现在对于图片,CSS,JavaScript和其他类似文件的静态内容, 他们说,你可以按照“永不过期”的政策,join10年过期。
  4. 这里的问题是,如果你不能改变静态文件的内容,例如,如果你caching一个JavaScript文件10年,而你做了一个小的改变,那么你需要乙醚来改变文件名,乙醚在它的最后添加一些参数。
  5. 现在,控件上的<%@ OutputCache被引用到服务器caching中,而不是客户端,实际做的是在服务器上caching控件的呈现,以便下一次请求它不要浪费时间渲染它再次,但从caching中读取 – 仍然发送到浏览器。

而且您还可以阅读更多的回答: IIS(dynamic和静态)caching,OutPutCache和浏览器caching之间有什么区别