在没有停机的情况下在负载平衡的网站上部署时避免无效的viewstate

时间:2012-10-12 16:16:13

标签: asp.net deployment webforms load-balancing

以下是该方案:

  1. 我们有3个网络服务器A,B,C。
  2. 我们希望在不取消应用程序的情况下发布新版本的应用程序 (例如,不使用“向下维护页面”)。
  3. 服务器A使用最新代码上线。
  4. 服务器B脱机。服务器B上的用户将路由到A和C.
  5. Page1.aspx已使用新控件进行了更新。从服务器B到服务器A的任何人 在此页面上执行操作时,此页面上将显示一个视图状态错误。这是我们想要阻止的。
  6. 你们中有些人如何解决这个问题?

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

    更天真的方法:

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

    不太天真的方法:

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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