我们有一个系统,可以在每个帖子后面动态创建页面控件,并使用浏览器历史记录等处理。
问题是在生产服务器(NLB上的2个节点)上,我们随机地在不同的点上得到我们没有发现的相关性,无法加载视图状态,控制树可能是不同的错误。但是,我们的登台服务器上的完全相同的代码(与生产相同的NLB设置)从未发生过。
我基本上排除了它的代码,因为它根本不会发生在开发/暂存或本地环境中,在生产中它是相当频繁的。这让我相信我们有一个配置错误,某处。
我在web.config中设置了硬编码的机器密钥,用于登台& amp;生产和会话都在MSSQL上备份。
如果有人有建议让我朝着正确的方向前进,那么我们整个开发团队都会被这个难过。
我们的webconfig位于pastbin:http://pastebin.com/m2kRTd0k
答案 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)
以下是您可以查看的一些内容:
答案 3 :(得分:0)
我们有一个非常相似的问题:负载平衡的生产服务器上出现“无法加载viewstate”错误,但是我们无法在本地/开发服务器上重现它(即使我们添加了其他实例以实现负载平衡)开发网站)。
最后,我们发现由于部署过程中的错误,其中一台生产服务器的版本与另一台服务器的版本不同,并且当用户在一台服务器上启动并继续使用另一台服务器(未配置Sticky IP)时,发生了视图状态错误。