无法在NLB上加载viewstate

时间:2011-07-04 13:35:18

标签: c# asp.net viewstate nlb failed-to-load-viewstate

我们有一个系统,可以在每个帖子后面动态创建页面控件,并使用浏览器历史记录等处理。

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

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

我在web.config中设置了硬编码的机器密钥,用于登台& amp;生产和会话都在MSSQL上备份。

如果有人有建议让我朝着正确的方向前进,那么我们整个开发团队都会被这个难过。

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

4 个答案:

答案 0 :(得分:0)

我公司的动态问卷表格完全由数据库驱动。

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

我们会在生产中遇到问题,但不会在我们的开发或qa环境中遇到问题,类似于你自己;但我们的问题是代码。当我们将应用程序推向生产时,有更多用户运行的场景比我们在dev / qa中所能完成的场景要多得多。

每当我们看到“未能加载viewstate”时,执行这两项操作之一通常可以解决问题:

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

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

答案 1 :(得分:0)

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

您可能想要尝试对视图状态进行分块。您可以通过在web.config中的maxPageStateFieldLength标记上设置pages属性来实现。这是一个例子

<pages maxPageStateFieldLength="900">

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

答案 2 :(得分:0)

以下是您可以查看的一些内容:

  • 您确定您编辑的web.config文件是使用的吗?尝试在其中添加语法错误,并发现您收到错误。
  • 检查舞台环境中未配置Sticky IP
  • 检查您的环境是否处于相同的修补程序级别,可能有一个默认值与另一个不同。
  • 两个环境所在的网络基础设施也可能存在差异

答案 3 :(得分:0)

我们有一个非常相似的问题:负载平衡的生产服务器上出现“无法加载viewstate”错误,但是我们无法在本地/开发服务器上重现它(即使我们添加了其他实例以实现负载平衡)开发网站)。

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