Yur*_*ter 6 asp.net viewstate infragistics runtime-error web-controls
是的,我知道这个问题已被多次报道,但我的情况似乎不符合任何建议的解决方案(除非我错过了什么).
ASP.NET页面设置(简化)是:用户单击链接(技术上是Infragistics WebDataTree的节点),此操作绑定位于UpdatePanel中的网格(Infragistics WebHierarchicalDataGrid).
现在这在本地测试系统中工作正常.当部署到生产服务器时 - 它也可以工作 - 大多数时候,但有时会抛出错误:
无法加载viewstate.正在加载视图状态的控制树必须与在上一个请求期间用于保存视图状态的控制树匹配
如果生产系统负载较重(访问它的用户越多),这似乎就会发生.同样,我没有构建任何动态控件,只是按钮和按钮单击时填充的网格.
可能是什么导致了这个?为什么这不会永远发生,但有时呢?知道怎么解决吗?
UPDATE
这是确认的情景
一个会话如何影响另一个会话的视图状态?
更新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)
}
}
}
Run Code Online (Sandbox Code Playgroud)
是的,我确实意识到这就像用螺丝刀锤击钉子一样优雅,但由于错误是零星的,刷新了它 - 这将是必须的.
您在生产中有多少台服务器?如果您在 web.config 中设置了多个machineKey,以便所有服务器都使用相同的密钥来签署/验证 ViewState 值?
正如 Michael Liu 在评论中指出的那样,您不太可能收到 machineKey 问题的控制树错误。我仍然想知道您是否有多个服务器在生产中,因为您仍然有可能遇到一个问题,即 ServerA 提供了较新版本的代码,然后 POST 返回到 ServerB 还没有新代码,所以控制树不匹配。如果您在站点上有活跃用户的情况下推出更改,即使使用单个服务器,这在技术上也可能发生。
归档时间: |
|
查看次数: |
4407 次 |
最近记录: |