2010-06-29 144 views
4

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

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

回答

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")%>' />

的功能应该得到的文件修改日期时间并将其追加到文件,所以如果文件是最后修改con 2010-01-01在10:12:34它应该产生这样的事情:

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

这样,无论何时修改文件,都会包含新的查询字符串并更新缓存。

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

HTH

0

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

目前我在一个地方管理版本号,并可以使用应用程序的管理界面进行控制。缺点是,一旦版本号发生变化,所有静态文件的版本号就会在整个应用程序中发生变化。

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

希望有所帮助。

0

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

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

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