部署到高流量网站时缓解视图状态控制树更改的技术

4
我帮助开发一个使用ASP.NET WebForms的相对高流量的Web应用程序。虽然我们使用的视图状态比较少,但目前我们确实需要它。
当部署主要主控页的更改时,我们经常会导致当前连接的用户在下次发出POST请求时收到错误。原因是他们的POST请求中存在的视图状态树不再与服务器期望发布的内容匹配。由于我们是一个Web应用程序,我们的许多页面都进行POST请求。
完整的错误信息当然是:
“Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.”
这对我们的用户来说自然是非常令人沮丧的。目前,我们试图:
1. 最小化对主控页的更改(至少是涉及服务器控件的更改) 2. 在低流量时段进行部署
我考虑过使用负载均衡器关联技巧,试图强制新登录用户使用新部署版本,同时使当前已登录用户保留旧版本 - 但这似乎非常复杂,并且在生产环境中维护多个代码库并不是我想要去的方向。
我知道这里技术上并不是我们的朋友,但我想知道是否有人有任何提示或技术可以减轻这个问题。

你也可以最小化视图状态,或者完全删除它 - 特别是对于造成问题的控件。我认为,在视图状态中保留的内容,你可以在视图状态更改时重新创建它,或者将其保存在缓存中,或者类似的方式。 - Aristos
1
为什么不在global.asax的Application_Error中处理错误,并将用户重定向到一个页面,告诉他们网页的新版本已发布? - Peter
谢谢 Petroj - 目前看来这可能是最好的备选方案。我只希望有一种更加愉快的技术方式! - pattermeister
1个回答

1

我在类似的情况下所做的是:关闭了Viewstate,并在主页面中创建了一个隐藏字段,用于加密guid和日期时间。我使用这个guid和日期时间来引用共享缓存中的一些值。

数据很小且短暂,不需要保留太长时间。根据访问量和您可以保留缓存数据的时间长度,还可以看到人们停留在页面上的时间。

有很多开源的共享缓存解决方案专门针对这种类型的角色进行调整。


好主意,谢谢。实际上,我们已经使用了共享缓存解决方案来在多个Web服务器之间同步应用程序状态。但是重新设计所有现有的遗留控件指向它而不是视图状态将是一项艰巨的任务。所以我想我正在寻找一张不存在的“出狱卡”! - pattermeister
为了进一步回答这个问题,我通过重新设计基础页面来实现这一点,因此,我只需要继承我的基础页面,而不是普通的页面,就可以重定向Viewstate使用这种方法。 - BaconSah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接