是的,我知道这个问题已被多次报道,但我的情况似乎不符合任何建议的解决方案(除非我错过了什么).
ASP.NET页面设置(简化)是:用户单击链接(技术上是Infragistics WebDataTree的节点),此操作绑定位于UpdatePanel中的网格(Infragistics WebHierarchicalDataGrid).
现在这在本地测试系统中工作正常.当部署到生产服务器时 - 它也可以工作 - 大多数时候,但有时会抛出错误:
无法加载viewstate.正在加载视图状态的控制树必须与在上一个请求期间用于保存视图状态的控制树匹配
如果生产系统负载较重(访问它的用户越多),这似乎就会发生.同样,我没有构建任何动态控件,只是按钮和按钮单击时填充的网格.
可能是什么导致了这个?为什么这不会永远发生,但有时呢?知道怎么解决吗?
UPDATE
这是确认的情景
如果一个用户访问并使用该页面 - 则不会发生错误
如果两个用户做同样的事情(甚至可以是来自同一客户端的2个浏览器会话) - 发生错误.
一个会话如何影响另一个会话的视图状态?
更新2
应用程序部署到单个Windows 2008/IIS7服务器(没有Web场/ Web园,没有负载平衡器).在运行时期间不会推出更新.
如果单个用户访问它,但是当多个用户访问服务器时,应用程序工作正常 - 最终其中一些用户正在获取ViewState错误(而其他用户仍能正常工作).他们都在做同样的事情 - 点击触发UpdatePanel内部网格重新绑定的树节点.他们使用不同的浏览器 - IE(9-11),FF,Chrome - 错误可能发生在随机用户/浏览器上
哦,我们也没有加密ViewState.
更新3
堆栈跟踪:
System.Web.UI.Control.Load上的System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)中System.Web.UI.Control.LoadViewStateRecursive(Object savedState)处的System.Web.UI.Control.LoadViewStateRecursive(Object savedState) System.Web.UI.UI.Control.LoadViewStateRecursive中的.LoadChildViewStateByIndex(ArrayList childState)(系统中System.Web.UI.Control.LoadViewStateRecursive(Object savedState)的System.Web.UI.Control.LoadChildViewStateByID(ArrayList childState)中的Object savedState). System.Web.UI.Control.LoadViewStateRecursive处的System.Web.UI.UI.Control.LoadChildViewStateByIndex(ArrayList childState)中的System.Web.UI.Control.LoadViewStateRecursive(Object savedState)中的Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) System.Web上的System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)中的System.Web.UI.Control.LoadViewStateRecursive(Object savedState)处的System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)处的Object savedState. UI.Control 系统.Web上的System.Web.UI.Page.LoadAllState()的System.Web.UI.Control.LoadViewStateRecursive(Object savedState)上的System.Web.UI.UI.Control.LoadChildViewStateByIndex(ArrayList childState)中的.LoadViewStateRecursive(Object savedState) .UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)
更新4
似乎如果我减少每次点击返回的数据大小(例如20行而不是100行),问题就会消失或者出现频率降低很多.
我已经尝试过操纵ViewState - 例如将其拆分为块,使用session作为ViewState存储来减少实际发布的页面大小 - 没有任何效果.
遵循这个建议,如何调试我的代码之外的东西,并获得对Infragistics WebHierarchicalDataGrid DLL及其源代码的调试符号的访问权限 - 控件抛出异常 - 它与viewstate无关.在1元素数组内部代码尝试访问第二个元素,抛出"IndexOutOfBound"异常,该异常经历了向用户抛出的"无法加载视图状态"的神奇转换.
Infragistics正在研究错误及其修复方法,但由于我们真的很紧迫,我们使用了以下解决方法:如果在异步回发结束时检测到"查看状态"错误 - 我们只需重新加载页面:
Sys.Application.add_load(appLoaded); function appLoaded(sender, eventArgs) { Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequest) } function EndRequest(sender, args) { if (args.get_error() != undefined) { if (args.get_error().message.indexOf('Failed to load viewstate') != -1) { setTimeout(function () { location.reload(true) }, 100) } } }
是的,我确实意识到这就像用螺丝刀锤击钉子一样优雅,但由于错误是零星的,刷新了它 - 这将是必须的.