4

我们有一个系统,可以在每次回发时动态创建页面控件,并使用浏览器历史记录等进行处理。

问题是在生产服务器(NLB 上的 2 个节点)上,我们随机出现在不同的位置,没有发现相关性,加载视图状态失败,控制树可能是不同的错误。但是,在我们的登台服务器上完全相同的代码(与生产相同的 NLB 设置)从未发生过。

我现在基本上排除了它的代码,因为它根本不会发生在开发/登台或本地环境中,在生产环境中它相当频繁。这让我相信我们在某个地方存在配置错误。

我在用于登台和生产的 web.config 中设置了硬编码的机器密钥,并且会话支持 MSSQL。

如果有人有建议让我朝着正确的方向前进,那就太好了,我们整个开发团队都会为此感到难过。

我们的 webconfig 位于 pastbin:http ://pastebin.com/m2kRTd0k

4

4 回答 4

1

您可以检查以下几点:

  • 您确定您编辑的 web.config 文件是使用的吗?尝试在其中添加语法错误,然后查看是否出现错误。
  • 检查您的舞台环境中是否未配置 Sticky IP
  • 检查您的环境是否处于相同的补丁级别,也许其中一个具有与另一个不同的默认值。
  • 两个环境所在的网络基础设施也可能有所不同
于 2011-07-14T20:55:48.620 回答
0

我的公司有一个完全由数据库驱动的动态调查表。

由于问题类型太多(例如是/否、基于值、多项选择、滑块、多级下拉菜单等),我们必须动态创建表单。

我们会在生产中遇到问题,但不会在我们的开发或质量保证环境中遇到问题,类似于您自己;但我们的问题是代码。当我们将应用程序推送到生产环境时,运行的用户数量比我们在 dev/qa 中所能做到的要多得多。

每当我们看到“加载视图状态失败”时,执行以下两件事之一通常会解决问题:

  • 仅在 INIT 阶段动态创建所有控件。应该在这里完成,以便 ViewState 正常工作而无需额外考虑。ViewState 在 INIT 完成后加载,并在 PRERENDER 完成后保存。我们可以在 LOAD 阶段创建控件,但接线可能存在细微差别。(http://msdn.microsoft.com/en-us/library/ms178472.aspx#general_page_lifecycle_stages)

  • 关闭 AJAX 并查看是否可以修复它(这通常是罪魁祸首)。如果这解决了它,那么我们只需要检查是否没有 AJAX 回发会导致页面更改其布局。AJAX 调用可能会做一些简单的事情,例如使控件不可见,或使用新 ID 重新呈现控件,从而导致下一次正常回发以检测控件树中的更改。如果我们必须通过 ajax 使控件不可见,我们只需添加属性 ('display','none') 代替。完成更改后,我们重新打开 AJAX。

于 2011-07-14T18:52:11.063 回答
0

各种浏览器都会发生这种情况吗?旧版本的 Safari 和一些代理服务器在将 ViewState 传递回服务器时会截断它。

您可能想尝试对视图状态进行分块的一件事。您可以通过在 web.config 中maxPageStateFieldLength的标记上设置属性来做到这一点。pages这里有一个例子

<pages maxPageStateFieldLength="900">

最后,您可能要考虑根本不使用客户端视图状态。这是一篇实现基于服务器端 SQL 的视图状态提供程序的文章:http: //www.codeproject.com/KB/viewstate/ViewStateProvider.aspx

于 2011-07-14T19:18:17.837 回答
0

我们有一个非常相似的问题:在负载平衡的生产服务器上发生“无法加载视图状态”错误,但我们无法在本地/开发服务器上重现它(即使我们添加了额外的实例以在开发站点上进行负载平衡) .

最后我们发现,由于部署期间的错误,其中一台生产服务器的版本与另一台不同,当用户在一台服务器上启动并继续到另一台服务器时(未配置粘性 IP),发生视图状态错误。

于 2020-05-20T22:27:18.547 回答