根据Ultra-Fast ASP.NET: Chapter 3 - Caching:
浏览器从服务器检索的文件应存储在 浏览器的缓存尽可能地帮助最小化服务器 往返。
但IIS如何知道静态内容实际上是什么,不是什么?
只是图片,CSS,JS 而不是 ASPX,ashx ......?
在哪里我可以在IIS中看到什么已经被认为是静态而不是?
使用<%@ OutputCache
标头声明页面(没有location
)的场景怎么样?其中的images
,CSS
和JS
源文件也是否使用相同的属性进行缓存?
作为最佳做法,我应将未来一年设为最长到期时间。我应该将其用作网站上所有静态内容的默认值
所以我这样做了:
但是稍后,在按下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>
答案 0 :(得分:68)
我了解你的情况。有时它会混淆IIS处理文件的方式。它对于IIS 6和IIS 7也有所不同,对于经典应用程序池和集成模式应用程序池也有所不同。我的经验主要是使用IIS 7.5上的集成应用程序池,因此我可以最准确地评论环境。
但IIS如何知道什么是静态内容,什么是静态内容 不?
它只是图像,css,js而不是ASPX,ashx ......?
我在IIS中哪里可以看到已经被认为是静态的 什么不是?
您可以通过导航到您的网站检查IIS中的文件处理程序列表,然后单击“处理程序映射”。默认情况下,这些都是从.Net base web.config继承的,它位于不同的位置,具体取决于您的.Net框架版本。
如果请求的文件尚未显式映射到另一个处理程序,则它将作为最后一个选项(*
)落入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)
Cache-Control Header
以在客户端浏览器计算机上缓存它。web.config
上的命令来执行以太操作。您在web.config上添加并关注IIS的命令与asp.net本身无关,但IIS和IIS将其配置保存在不同的文件中,因此当您直接更改缓存控件头时你没有在web.config上看到它们的IIS。<%@ OutputCache
被引用到服务器缓存而不是客户端,实际上做的是在服务器上缓存控件的渲染,以便下次你不要求它浪费时间再次渲染它但是从缓存中读取它 - 仍然将它发送到浏览器。您还可以阅读以下答案:What are difference between IIS (Dynamic and Static) cache,OutPutCache and browser cache