Asp.net 我是否应该忽略偶尔出现的无效viewstate错误?
时不时(每天一次左右)我们会在ASP.NET 3.5应用程序的日志中看到以下类型的错误Asp.net 我是否应该忽略偶尔出现的无效viewstate错误?,asp.net,error-handling,viewstate,Asp.net,Error Handling,Viewstate,时不时(每天一次左右)我们会在ASP.NET 3.5应用程序的日志中看到以下类型的错误 无效的视图状态 回发或回调参数无效 这些是ASP.NET应用程序中经常发生的事情吗?有谁会建议我们花大量时间来诊断问题的原因吗?对于前者,您无能为力-我会捕获此类异常,并将用户返回到错误页面,页面上会显示以下信息:“您所在的页面已过期。当您尝试重新访问已输入数据的页面时,通常会发生这种情况。” 我在使用UpdatePanels的相当大的页面上看到了后者。我认为这是当用户在页面加载完成之前发回(或者可能回叫
- 无效的视图状态
- 回发或回调参数无效
这些是ASP.NET应用程序中经常发生的事情吗?有谁会建议我们花大量时间来诊断问题的原因吗?对于前者,您无能为力-我会捕获此类异常,并将用户返回到错误页面,页面上会显示以下信息:“您所在的页面已过期。当您尝试重新访问已输入数据的页面时,通常会发生这种情况。” 我在使用UpdatePanels的相当大的页面上看到了后者。我认为这是当用户在页面加载完成之前发回(或者可能回叫)时,所以并不是所有在页面末尾被标记的javascript都已经运行
同样,除了在错误页面上显示一条适当友好的消息外,您对此也无能为力。这取决于具体情况。无效的视图状态可能由于各种原因而发生
无论您做什么,请不要关闭viewstate或事件验证。一个问题可能与用户路由器截断表单字段有关。解决方法是将MaxPageStateFieldLength设置为较小的数字(如100)在web.config中,ViewState会被分解成小块。这非常简单,并对其进行了充分的解释。异常不会不时“发生”。它们总是出于合理的原因出现,其中一些原因已在其他答案中列出 <>但是,为了减轻VIEWSTATE的问题,请考虑完全禁用它。作为ASP.NET开发人员,我们通常倾向于在不需要的所有地方使用VIEWSTATE,因为它是默认的。在考虑使用控件之前,我通常会考虑使用静态HTML。如果您决定使用控件,请考虑它是否真的需要查看。要启用的状态。禁用它通常会导致更好的页面加载时间,所以如果可以,请执行此操作 我希望它在默认情况下是禁用的,所以人们被迫这样想,但事实并非如此 更新以回答评论: 在我的脑海中,我想出了3个关闭ViewState的机会
如果您将数据存储到真正静态的内容,您也可以考虑禁用视图状态。有时我会找到一个列表,该列表是数据库中的一个小的静态BaseDATA表的数据或类似的东西。现在,这可能是危险的,但如果我确信数据不会改变,我可能会将数据作为静态内容移动到页面中。(您可以将其包装在一个单独的控件中,这样就不会有多个数据的静态副本)。但是,如果数据发生更改,则必须手动更改
最后,您可以切换到ASP.NET MVC框架,永远告别这些问题,这就是我计划要做的,即使我将面临其他一些问题。;)忽略这个错误可能不是一个好主意。除了以上所有的答案之外,你还可以考虑查看你的VIEW状态有多大。一个大的VIEW状态可以被代理服务器截断。
如果您的视图状态很大,则最好使用ASP.net跟踪来查看哪些控件正在使用viewstate,以及在何处可以关闭此功能。BlowDart对无效的viewstate问题有正确的答案。可能是您的应用程序池被回收并更改了加密密钥 请参阅这些帖子以获得支持:
根据Wayne Walter Berry在博客文章中的说法,另一个罪魁祸首可能是在IE8中使用XHTML doctype,而页面上没有与XHTML兼容的标记。这可能会导致IE8向scriptresource.axd发送加扰参数,并引发无效的viewstate异常
他建议确保所有javascript块都用
/
包装,或者只需更改doctype(这可能会导致页面上出现其他css/样式问题)。更新:Microsoft宣布以下针对IE 8的错误修复程序修复了此问题:我的日志中引发了此类异常,原因与此处列出的其他异常非常不同。我确实有一个非常大的ViewState,这是问题的一部分。但这与另一个问题相结合,导致了这些异常(可能是偶尔出现的坏情况)
void Application_Error(object sender, EventArgs e)
{
if (ex is HttpException && ex.InnerException is ViewStateException)
{
Response.Redirect(Request.Url.AbsoluteUri);
return;
}
}