IIS和静态内容?

Roy*_*mir 46 asp.net iis-7 caching header http

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

浏览器从服务器检索的文件应尽可能长时间地存储在浏览器的缓存中,以帮助最小化服务器往返.

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

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

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

  • 如何使用<%@ OutputCache标题声明页面(没有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>
Run Code Online (Sandbox Code Playgroud)

Ben*_*yne 70

我了解你的情况.有时它会混淆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\CONFIG\web.config中

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

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

<configuration>
  <system.webServer>
    <handlers>
      <add name="StaticHandler" verb="*" path="*.zip" type="System.Web.StaticFileHandler" preCondition="integratedMode" />
    </handlers>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

此示例使用<system.webServer>config部分,因此它用于在集成模式下运行的App Pool .

第二个问题

使用<%@ 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>
Run Code Online (Sandbox Code Playgroud)

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

<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <!-- stuff -->
        </modules>
    </system.webServer>
<system.webServer>
Run Code Online (Sandbox Code Playgroud)

这只是确保通过托管静态文件处理程序处理静态文件,该处理程序遵循上述配置元素.

编辑以发表评论

您在上面发布的配置对话框的文档位于此处:配置HTTP Expires响应标头(IIS 7)

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

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