【发布时间】:2014-01-29 22:11:38
【问题描述】:
是的,我知道这个问题已被多次报告,但我的案例似乎不适合任何建议的解决方案(除非我遗漏了什么)。
ASP.NET 页面设置(简化)是:用户单击链接(技术上是 Infragistics WebDataTree 的一个节点),此操作将绑定位于 UpdatePanel 中的网格 (Infragistics WebHierarchicalDataGrid)。
现在这在本地测试系统中运行良好。当部署到生产服务器时 - 它也可以工作 - 大多数时候,但有时这会引发错误:
加载视图状态失败。视图状态所在的控制树 正在加载的必须与用于保存的控制树匹配 上一个请求期间的视图状态
如果生产系统负载较重(更多用户访问它),这种情况似乎会发生更多。同样,我没有构建任何动态控件,只是一个按钮和一个在按钮单击时填充的网格。
这可能是什么原因造成的?为什么这并不总是发生,而是有时?知道如何解决吗?
更新
这是确认的场景
- 如果一个用户访问并使用该页面 - 不会发生错误
- 如果两个用户执行相同的操作(甚至可以是来自同一客户端的 2 个浏览器会话)- 就会发生错误。
一个会话如何影响另一个会话的视图状态?
更新 2
应用程序部署到单个 Windows 2008/IIS7 服务器(无网络农场/网络花园,无负载平衡器)。运行时不会推出更新。
如果单个用户访问应用程序,它可以正常工作,但是当多个用户访问服务器时 - 最终其中一些用户会收到 ViewState 错误(而其他用户仍然可以正常工作)。他们都在做同样的事情——单击在 UpdatePanel 内触发网格重新绑定的树节点。他们使用不同的浏览器 - IE(9-11)、FF、Chrome - 随机用户/浏览器可能会发生错误
哦,我们也没有加密 ViewState。
更新 3
堆栈跟踪:
在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) 在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) 在 System.Web.UI.Control.LoadViewStateRecursive(对象已保存状态在 System.Web.UI.Control.LoadChildViewStateByID(ArrayList childState) 在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) 在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) 在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) 在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) 在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) 在 System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 在 System.Web.UI.Page.LoadAllState() 在 System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint)
更新 4
如果我减小每次点击返回的数据的大小(例如 20 行而不是 100 行),问题似乎要么消失,要么出现的频率大大降低。
我尝试过操纵 ViewState - 例如将其拆分成块,使用 session 作为 ViewState 存储来减少实际发布的页面大小 - 没有任何效果。
【问题讨论】:
-
检查您是否在使用自定义视图状态提供程序
-
你能把页面的代码贴出来吗?听起来您有一些静态控件。
-
整个代码发布起来非常复杂,如果有帮助,我可以发布片段,但基本上在单击事件处理程序中分配了网格数据源。没有静态(相当“共享”,因为它使用了 VB.NET 控件)所有控件都在 ASPX 标记中声明
-
您可能没有任何明确的动态控件,但网格听起来是动态的,这意味着它正在构建一个应用视图状态的控件树。一个用户是否有可能更新网格的源(从而添加/删除记录,从而添加/删除有状态控件)?这将导致另一个用户的后续回发包含现在已过时的视图状态。
-
@TimMedora 这会在其他情况下导致问题吗?标准场景: 1. 用户点击按钮查看初始数据 2. 数据库中的数据发生变化 3. 用户再次点击按钮刷新网格中的数据
标签: asp.net runtime-error viewstate infragistics web-controls