背景信息:文件复制是蹩脚的
目前,我们有一个大规模、高流量的 ASP.NET Web 应用程序,负载平衡在 8 个不同的 IIS 服务器上。由于站点的性质,对 .aspx 文件和 .ascx 控件的微小更改会在一天中频繁发生,并且在经过测试并发布到现场后,会定期通过 xcopy 部署复制到每个公共网络服务器10分钟。
当然,这是非常低效的,因为每个服务器都必须有整个站点的冗余副本,我们希望消除 10 分钟的发布延迟。
可能的改进:从共享存储托管
我们现在可以选择使用带有 iSCSI 接口的集中式存储来集中托管整个站点,每个服务器都认为远程存储是本地驱动器。发布将是即时的和全系统的。
注意:无法将驱动器从 UNC 共享中托管,因为站点结构中有许多不同的目录,每个目录都需要用于 ASP.NET 的 FileSystemWatcher 来监视更改,因此很快就会达到 SMB 最大命令数。是的,我们知道 MaxCmds 和 MaxMpxCt 注册表设置。
问题:Web.config 更改触发大量重新编译
我们预见到的问题是文件系统结构的某些更改可能导致几乎每个已编译的 .aspx 或 .ascx 都必须重新编译,从而导致请求排队和服务器已关闭的感觉。大多数资源并未在系统范围内使用,因此在更改时重新编译它们几乎不会导致资源中断。站点上所有页面使用的全局母版页可能会导致此问题,但这可以通过代码轻松管理。
罪魁祸首是 web.config 文件。对 web.config 文件的更改会导致整个 Web 应用程序循环使用,并进行重新编译。因此,我们目前不复制 web.config 更改。任何 web.config 更改都需要将 Web 服务器从负载平衡器中移除,应用(和测试)更改,然后使用垃圾请求预热服务器,然后再将其放回负载平衡器上。
但是,如果 web.config 文件与 Web 应用程序目录结构的其余部分一样位于集中存储上,则该文件只有一份副本,并且无法再对各个服务器进行修补和预热。
问题
有没有办法让 ASP.NET Web 应用程序从名为 Web.config 的文件以外的源获取其行进命令?
理想情况下,每台服务器只有一个文件,例如:
- 默认.aspx
- 全球.asax
- Web-ServerA.config
- Web-ServerB.config
- ...
- Web-ServerN.config
无论如何,名称“web.config”在哪里定义?是否有可以在每台服务器上设置的注册表设置?是否可以在 machine.config 或全局 web.config 中创建一个条目来指定要使用的文件?
超出范围的事情
我很清楚,我不是在问如何为调试、测试和实时设置不同的 AppSettings。还有其他主题涵盖了这一点,而且我的所有 web.config 大部分时间都是相同的,唯一需要它们不同的时候是执行更新时。
我们没有将 web.config 用于任何 appSettings 信息;这是针对真正重要的东西,例如程序集引用、httpHandler 定义和其他无法数据库化的 system.web 设置。
更新
我尝试在注册表中搜索 Web.config,除了指出我最近编辑过 web.config 文件的应用程序之外,什么也没找到,我显然做了很多。那里没有帮助。