【问题标题】:Avoiding invalid viewstate when deploying on a load balanced website without downtime在不停机的负载平衡网站上部署时避免无效的视图状态
【发布时间】:2013-01-14 06:42:26
【问题描述】:

这是场景:

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

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

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

比较幼稚的做法:

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

不那么天真的方法:

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

【问题讨论】:

    标签: asp.net deployment webforms load-balancing


    【解决方案1】:

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

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

    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% 正常运行时间的应用程序的最佳做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-14
      • 2010-10-21
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多