3

背景信息:文件复制是蹩脚的

目前,我们有一个大规模、高流量的 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 文件的应用程序之外,什么也没找到,我显然做了很多。那里没有帮助。

4

2 回答 2

1

我的第一个问题是你在 web.config 中保留了什么 & 你可以将它移动到数据库中吗?我们将每个配置设置保存在数据库中的表中,并使用 machine.config 来存储数据库连接信息。

不知道对你有多少重写,但它会避免你的问题。

另一种选择是将您的配置项存放在一个外部文件中,并从 web.config 中引用它。在 aspnet wp 被回收之前,不会重新读取对该文件的更改,但允许您更改设置,然后通过 IISRESET 循环每个服务器。

<configuration>
   <appSettings file="OtherFile.config">
...
于 2009-04-14T19:04:10.643 回答
0
  1. 只是好奇,您使用的是什么文件系统?NTFS 不是共享存储文件系统。换句话说,一次不能有多个节点写入文件系统。

  2. 我建议在 IIS 中的站点下使用虚拟目录。这可能需要对代码布局进行一些重组,但不应该太大。因此,您将拥有站点的根主目录以及特定于该计算机的 web.config,然后将 vdir 映射到您设置的任何共享文件系统资源。

于 2009-05-12T17:41:52.510 回答