【问题标题】:Static content caching静态内容缓存
【发布时间】:2010-06-29 04:49:00
【问题描述】:

我们公司正在使用 IIS7 和 dotnet 3.5 来构建我们内部和外部客户使用的不同 Web 应用程序。建议我们开始使用静态内容缓存来缓存图像和 html 文件。 我的理解是,在 web.config 文件中,我们可以设置 cachecontrolmaxage 来指定需要缓存文件的天数。 此外,我们还建议我们通过传递参数 myjsfile.js?verfile=1234 来调用这些静态页面,该参数可以在文件的新版本投入生产时进行更改。

我希望我去上面对吗?现在正在寻找的是实现第二部分的更好方法,而不是每次创建新文件时都必须传递新版本号,我们可以以其他方式部署它,以便对静态文件进行任何新更改在生产环境中。我想寻找的是一种在生产中推广多个图像和静态文件的简单方法,而无需担心更改版本号。

【问题讨论】:

    标签: .net .net-3.5 iis-7


    【解决方案1】:

    从 IIS7 开始,所有 IIS 配置都可以通过 web.config 文件应用,更具体地说是system.webServer section。在这种情况下,您应该检查Caching Section 并创建一个custom profile(确保将varyByQueryString 属性设置为true 以使“?version=xxx”工作)。

    进入部署问题,有必要更改 url,因为客户端在缓存有效时不会检查文件的新版本(并且您说您可能希望将天数设置为缓存持续时间)。一种常见的模式是根据修改日期自动生成 url,例如,如果您的原始行是:

    <script src='functions.js' />

    你可以改成:

    <script src='<%=GetFilenameWithModificationDate("functions.js")%>' />

    该函数应该获取文件修改日期时间并将其附加到文件中,因此如果文件最后修改时间为 2010 年 1 月 1 日 10:12:34,它应该生成如下内容:

    <script src='functions.js?version=20100101101234' />

    这样,每当您修改文件时,都会包含一个新的查询字符串并更新缓存。

    由于您正在缓存静态文件文件,我假设性能是一个考虑因素,因此您应该考虑检查每个文件的修改日期的代价,并且您可能希望在辅助函数、控件或无论您决定使用哪种机制。

    HTH

    【讨论】:

      【解决方案2】:

      是的,关于使用带有版本的查询字符串的一点是正确的并且它有效。但是,我不确定更改 web.config 中的设置是否真的适用于静态内容。静态内容的缓存由 IIS 管理员根据我工作地点的开发人员推荐在 IIS 中管理。

      目前我在一个地方管理版本号,并且可以通过应用程序的管理 UI 进行控制。缺点是一旦版本号改变,整个应用程序的所有静态文件的版本号都会改变。

      另外,每个静态文件都以版本作为文件名的一部分命名,因此一旦部署了内容,就无需更改任何内容。但是,这也意味着引用静态内容的代码也需要使用完整的文件名来引用它们,并且需要在更改静态内容时进行更改。

      希望有所帮助。

      【讨论】:

        【解决方案3】:

        请记住,IIS 只会为映射到 asp.net ISAPI 的文件调用 .NET 运行时。因此 .html、.jpg 等静态内容不会受到任何 web.config 设置的影响。您可以映射它们,但那样会失去性能。可能不是最好的路线。

        对于脚本代码,我通常使用像上面所说的airmanx这样的系统。附加到 URL 的 .config 中的全局设置,并在有新版本时更新。您可以通过获取应用程序的构建号并将其传入来自动执行此操作。

        对于静态内容,您可以考虑提供来自不同域(例如 content.domain.com)的所有内容,并在 IIS 中管理标头以进行缓存、内容过期等。这是一个非常简单的解决方案不需要太多开销,但如果您需要使内容过期,则必须让您的操作人员参与其中。这不是一个完全自动化的解决方案,但我发现它在我工作过的大多数大型网站上都运行良好。

        【讨论】: