我们有一个系统,它可以在每次发回信息时动态创建页面的控件,并使用浏览器的历史记录等进行处理。
问题是,在生产服务器(NLB上的2个节点)上,我们随机地进入不同的网点,没有发现相关性,加载视图状态失败,控制树可能是不同的错误。但是,从未在我们的登台服务器上使用完全相同的代码(NLB设置与生产相同)。
我基本上在这一点上排除了它的代码,因为它根本不在开发/登台或本地环境中发生,在生产中它相当频繁。这使我不敢相信我们在某处存在配置错误。
我已经在登台和生产中使用的web.config中设置了硬编码的计算机密钥,并且会话在MSSQL上得到支持。
[如果有人提出建议,让我朝正确的方向前进,那将是很棒的,我们整个开发团队都会为此感到沮丧。
我们的网络配置位于pastbin:http://pastebin.com/m2kRTd0k
以下是您可以检查的几件事:
我在公司中有一个动态调查表,该表完全由数据库驱动。
由于问题类型太多(例如,是/否,基于值,多项选择,滑块,多级下拉菜单等...,我们必须动态创建表单。
我们会在生产中遇到问题,但不会在开发环境或质量保证环境中遇到与您类似的问题;但是我们的问题是代码。当我们将应用程序推向生产环境时,与我们在dev / qa中所能完成的场景相比,有更多的用户正在运行着更多的场景。
[每当我们看到'无法加载viewstate时,执行以下两项操作之一通常都会解决问题:
仅在INIT阶段动态创建所有控件。无需过多考虑即可在此处完成ViewState的正常工作。在INIT完成后加载ViewState,并在PRERENDER完成后保存。我们可以在LOAD阶段之前创建控件,但是可能会有一些细微差别。 (http://msdn.microsoft.com/zh-cn/library/ms178472.aspx#general_page_lifecycle_stages)]]
关闭AJAX,看看是否可以解决(通常是罪魁祸首)。如果此问题得以解决,那么我们只需检查是否存在导致页面更改其布局的AJAX回发。 AJAX调用可能会做一些简单的事情,例如使控件不可见,或使用新ID重新呈现控件,从而导致下一次下一次正常回发来检测控件树中的更改。如果必须通过ajax使控件不可见,则只需添加attribute('display','none')即可。完成更改后,我们重新打开AJAX。
这种情况是否会在各种浏览器中发生?有较旧版本的Safari和某些代理服务器,当将ViewState传递回服务器时,它们会截断ViewState。
我们有一个非常相似的问题:在负载平衡的生产服务器上发生“无法加载viewstate”错误,但是我们无法在本地/开发服务器上重现它(即使我们添加了其他实例以在开发中实现负载平衡网站)。>
最后,我们发现由于部署过程中的错误,其中一台生产服务器的版本与另一台服务器的版本不同,并且当用户在一个服务器上启动并继续使用另一台服务器(未配置Sticky IP时,发生视图状态错误。