3

这是场景:

  1. 我们有 3 个 Web 服务器 A、B、C。
  2. 我们希望在不关闭应用程序的情况下发布应用程序的新版本
    (例如,不使用“Down for maintenance”页面)。
  3. 服务器 A 使用最新代码上线。
  4. 服务器 B 脱机。服务器 B 上的用户被路由到 A 和 C。
  5. Page1.aspx 已使用新控件进行了更新。在此页面上从服务器 B 到服务器 A 的任何人
    在此页面上执行操作时都会收到视图状态错误。这是我们要防止的。

你们中的一些人如何解决这个问题?

以下是我们的一些想法(是否可能使用我们的负载均衡器,我不知道......我不熟悉负载均衡器配置[它是 F5]):

更天真的方法:

关闭服务器 A 和 B 并更新。C 保留旧代码。所有流量都将被定向到 C,这没关系,因为它是旧代码。当 A 和 B 进行更新时,如果可能的话,告诉负载均衡器只保留 C 上具有活动会话的人,并且所有新会话都在 A 和 B 上启动。这种方法的问题是理论上会话可以持续如果用户继续使用该应用程序很长一段时间。

不那么天真的方法:

类似于天真的方法,除了(如果可能的话)我们告诉负载均衡器有关“安全”页面的信息,这些页面是未更改的页面。当用户最终到达“安全”页面时,他或她会被路由到服务器 A 或 B。理论上,用户可能永远不会登陆其中一个页面,但这种方法风险较小(但需要更多工作)。

4

1 回答 1

7

我假设您的负载平衡器在正常操作期间将单个用户引导回 Web 场中的同一台服务器,这就是为什么您通常不会遇到此问题,但只有在您开始在服务器之间重定向用户时才会遇到此问题。

如果该假设是正确的,那么问题很可能是服务器场中的机器密钥不一致。

ViewState 针对服务器的机器密钥进行哈希处理,以防止客户端用户篡改。机器密钥由 IIS 自动生成,每次服务器重新启动或重置时都会更改,并且对每个服务器都是唯一的。

为了确保当用户在服务器之间移动时不会遇到视图状态验证问题,有两种可能的操作方案。

  1. 使用带有 false 值的 enableViewStateMac 属性在单个页面上或在 web.config 文件的 pages 元素中全局禁用防篡改保护。我提到这一点纯粹是为了完整起见——你永远不应该在生产网站上这样做。

  2. 在每台服务器上手动生成机器密钥并在每个应用程序之间共享相同的值(您可以对所有应用程序使用相同的密钥,但明智的做法是为每个应用程序使用一个密钥以最大限度地提高安全性)。为此,您需要生成密钥(不要使用您在 Internet 上的演示中看到的任何密钥,这违背了唯一机器密钥的目的),这可以通过编程方式或在 IIS 管理器中完成(参见http://www. codeproject.com/Articles/221889/How-to-Generate-Machine-Key-in-IIS7)。将网站部署到所有服务器时使用相同的机器密钥。

我无法回答升级需要 100% 正常运行时间的应用程序的最佳实践。

于 2013-01-13T22:42:26.227 回答