IIS和静态内容?
根据超快速ASP.NET:第3章 – caching :
浏览器从服务器检索到的文件应尽可能长时间存储在浏览器的caching中,以帮助最大限度地减less服务器往返次数。
-
但是,IIS如何知道静态内容实际上是什么?
它只是图像,CSS,JS 而不是 ASPX,ashx …?
我在哪里可以看到什么已经被认为是静态的 ,什么不是 ?
-
如何使用
<%@ OutputCache
标头声明页面(没有location
)? 其中的images
,CSS
和JS
源文件也被输出caching具有相同的属性? -
作为一个最佳实践,我应该设定一个未来一年的最长过期时间。 我应该使用它作为网站上所有静态内容的默认值
所以我这样做了:
但后来,按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这个位置是准确的!
- 静态内容是IIS无需任何处理就可以读取并发送到浏览器的内容。 在那里,您可以设置IIS以包含一些
Cache-Control Header
caching在客户端浏览器计算机上。 - 您可以通过直接设置IIS来执行以太网,如您所说,可以通过
web.config
的命令来实现。 你在web.config上添加的关于IIS的命令,并不是与asp.net自己做的,而是IIS和IIS把他的configuration保存在一个不同的文件上,所以当你直接改变caching控制头时IIS在web.config上没有看到它们。 - 现在对于图片,CSS,JavaScript和其他类似文件的静态内容, 他们说,你可以按照“永不过期”的政策,join10年过期。
- 这里的问题是,如果你不能改变静态文件的内容,例如,如果你caching一个JavaScript文件10年,而你做了一个小的改变,那么你需要乙醚来改变文件名,乙醚在它的最后添加一些参数。
- 现在,控件上的
<%@ OutputCache
被引用到服务器caching中,而不是客户端,实际做的是在服务器上caching控件的呈现,以便下一次请求它不要浪费时间渲染它再次,但从caching中读取 – 仍然发送到浏览器。
而且您还可以阅读更多的回答: IIS(dynamic和静态)caching,OutPutCache和浏览器caching之间有什么区别