Asp.net 我是否应该忽略偶尔出现的无效viewstate错误?

Asp.net 我是否应该忽略偶尔出现的无效viewstate错误?,asp.net,error-handling,viewstate,Asp.net,Error Handling,Viewstate,时不时(每天一次左右)我们会在ASP.NET 3.5应用程序的日志中看到以下类型的错误 无效的视图状态 回发或回调参数无效 这些是ASP.NET应用程序中经常发生的事情吗?有谁会建议我们花大量时间来诊断问题的原因吗?对于前者,您无能为力-我会捕获此类异常,并将用户返回到错误页面,页面上会显示以下信息:“您所在的页面已过期。当您尝试重新访问已输入数据的页面时,通常会发生这种情况。” 我在使用UpdatePanels的相当大的页面上看到了后者。我认为这是当用户在页面加载完成之前发回(或者可能回叫

时不时(每天一次左右)我们会在ASP.NET 3.5应用程序的日志中看到以下类型的错误

  • 无效的视图状态
  • 回发或回调参数无效

这些是ASP.NET应用程序中经常发生的事情吗?有谁会建议我们花大量时间来诊断问题的原因吗?

对于前者,您无能为力-我会捕获此类异常,并将用户返回到错误页面,页面上会显示以下信息:“您所在的页面已过期。当您尝试重新访问已输入数据的页面时,通常会发生这种情况。”

我在使用UpdatePanels的相当大的页面上看到了后者。我认为这是当用户在页面加载完成之前发回(或者可能回叫)时,所以并不是所有在页面末尾被标记的javascript都已经运行


同样,除了在错误页面上显示一条适当友好的消息外,您对此也无能为力。

这取决于具体情况。无效的视图状态可能由于各种原因而发生

  • Viewstate太大,在用户对页面进行回发之前尚未完成渲染。修复方法通常是禁用触发回发的所有控件,并在页面完成加载后在客户端启用这些控件-请参阅
  • 您正在使用viewstate Mac(出于安全原因,您应该这样做),但尚未设置计算机密钥,并且应用程序池已循环生成一个新的计算机密钥。不要忘记设置ViewStateUserKey
  • 有人在mac上使用旧版本的IE,它会截断隐藏的表单字段。在这种情况下,您需要将viewstate从页面移到
  • Viewstate MAC问题通常表示您在web场上,忘记在web.config中设置机器密钥。但是,如果您这样做了,则可能是有人试图做坏事(机器人程序发布评论,有人试图触发禁用控件的事件等)如果只是为了排除潜在的安全问题,那么应该追踪这些问题的原因

  • 无论您做什么,请不要关闭viewstate或事件验证。

    一个问题可能与用户路由器截断表单字段有关。解决方法是将MaxPageStateFieldLength设置为较小的数字(如100)在web.config中,ViewState会被分解成小块。这非常简单,并对其进行了充分的解释。

    异常不会不时“发生”。它们总是出于合理的原因出现,其中一些原因已在其他答案中列出

    <>但是,为了减轻VIEWSTATE的问题,请考虑完全禁用它。作为ASP.NET开发人员,我们通常倾向于在不需要的所有地方使用VIEWSTATE,因为它是默认的。在考虑使用控件之前,我通常会考虑使用静态HTML。如果您决定使用控件,请考虑它是否真的需要查看。要启用的状态。禁用它通常会导致更好的页面加载时间,所以如果可以,请执行此操作

    我希望它在默认情况下是禁用的,所以人们被迫这样想,但事实并非如此

    更新以回答评论:

    在我的脑海中,我想出了3个关闭ViewState的机会

  • 如果每次回发都加载数据,则禁用ViewState。如果您正在构建支持AJAX的站点,通常会出现这种情况(这是真正的AJAX,而不是那种UpdatePanel;)),通常在第一次加载时加载数据,然后使用AJAX请求重新加载/更新数据。在某些情况下,您甚至可能每次访问时加载数据的唯一目的是禁用ViewState,然后将数据缓存到服务器上

  • <> LI>

    如果您将数据存储到真正静态的内容,您也可以考虑禁用视图状态。有时我会找到一个列表,该列表是数据库中的一个小的静态BaseDATA表的数据或类似的东西。现在,这可能是危险的,但如果我确信数据不会改变,我可能会将数据作为静态内容移动到页面中。(您可以将其包装在一个单独的控件中,这样就不会有多个数据的静态副本)。但是,如果数据发生更改,则必须手动更改

  • 标签等简单控件通常是禁用ViewState的好选择


  • 最后,您可以切换到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;
                    }
        }