我们在公司使用IIS7和dotnet 3.5来构建我们的内部和外部客户使用的不同Web应用程序。我们建议我们开始使用静态内容缓存来缓存图像和html文件。 我的理解是在web.config文件中我们可以设置cachecontrolmaxage来指定需要缓存文件的天数。 此外,我们建议我们通过传递一个参数来调用这些静态页面,例如myjsfile.js?verfile = 1234,只要文件的新版本投入生产,就可以更改这些参数。
我希望我走到上面吗?现在我们正在寻找的是一种更好的方法来实现第二部分,而不是每次创建新文件时都必须传递新的版本号,我们可以通过其他方式部署它,以便对静态文件进行任何新的更改在生产环境中。我想要的是在生产中推广多个图像和静态文件的简单方法,而不必担心更改版本号。
答案 0 :(得分:1)
由于IIS7可以通过web.config文件应用所有IIS配置,更具体地说是system.webServer section。在这种情况下,您应该检查Caching Section并创建一个custom profile(确保将varyByQueryString属性设置为true以使“?version = xxx”工作)。
进入部署问题时,由于客户端在缓存有效时不会检查文件的新版本(并且您可能希望将天数设置为缓存持续时间),因此必须更改URL。一种常见的模式是根据修改日期自动生成URL,例如,如果您的原始行是:
<script src='functions.js' />
您可以将其更改为:
<script src='<%=GetFilenameWithModificationDate("functions.js")%>' />
该函数应该获取文件修改日期时间并将其附加到文件中,因此,如果文件是在2010年10月1日10:12:34的最后一次修改,它应该生成如下内容:
<script src='functions.js?version=20100101101234' />
这样,无论何时修改文件,都会包含一个新的查询字符串,并且将更新缓存。
由于您正在缓存静态文件文件,我假设性能是一个考虑因素,因此您应该考虑检查每个文件的修改日期的惩罚,并且您可能希望在辅助函数中使用缓存,控制或无论你决定使用哪种机制。
HTH
答案 1 :(得分:0)
是的,关于在版本中使用查询字符串的一点是正确的,它可以工作。但是,我不确定更改web.config中的设置是否实际应用于静态内容。 IIS管理员根据我工作的开发人员推荐,在IIS管理静态内容的缓存。
目前我在一个地方管理版本号,可以使用应用程序的管理UI进行控制。缺点是一旦版本号发生变化,整个应用程序的所有静态文件的版本号都会改变。
或者,每个静态文件都以版本命名,作为文件名的一部分,因此一旦部署了内容,就不需要更改任何内容。但是,这也意味着引用静态内容的代码也需要使用完整的文件名来引用它们,并且需要在更改静态内容时进行更改。
希望有所帮助。
答案 2 :(得分:0)
请记住,IIS只会为映射到asp.net ISAPI的文件调用.NET运行时。因此,静态内容(如.html,.jpg等)不会受到任何web.config设置的影响。你可以映射它们,但是你会失去性能。可能不是最好的路线。
对于脚本代码,我通常使用像上面说的airmanx这样的系统。 .config中的全局设置,附加到URL,并在有新版本时更新。您可以通过抓取应用程序的构建#并将其传递来自动化。
对于静态内容,您可以考虑提供来自不同域(例如,content.domain.com)的所有内容,并管理IIS中的标头以进行缓存,内容过期等。这是一个非常简单的解决方案。这需要太多的开销,但是如果你需要使内容过期,你必须让你的操作人员参与进来。它不是一个完全自动化的解决方案,但我发现它在我工作的大多数大型网站上运行良好。