跟踪无效的回发或回调参数

3
在我的未处理异常日志中,我经常在某个页面上看到这个错误。我没有在页面上创建任何程序控件,也没有将任何按钮绑定到页面上。
在我的日志记录中,我获取当前处理程序,这是我知道页面的位置,以及堆栈跟踪,但由于堆栈跟踪只是说它归结为Page.ProcessPostData,所以它并没有提供任何有意义的信息。
有没有办法记录更有意义的数据?比如记录它收到了什么和期望收到什么?
我无法在任何地方重现这个问题。

遇到类似的问题,我认为这个错误是我遇到过最烦人的错误之一。 - Kasrak
1
@Sypress 这个错误是 ASP.NET WebForms 中的一些幽灵错误之一,这促使我转向 MVC2、MVC3,很快就会是 MVC4。我从未回头。 - Chris Marisic
这也是我要走的路线,但我做的项目是基于Web Forms的,继续加油 ;) - Kasrak
2个回答

3
您可以像这样查看请求的所有表单参数:
if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Request != null) {
    foreach (string key in System.Web.HttpContext.Current.Request.Form.Keys) {
        if (key.IndexOf("__VIEWSTATE") == -1) {
            //key:   key
            //value: System.Web.HttpContext.Current.Request.Form[key]
        }
    }
}

你能否解释一下我应该如何使用这段代码来跟踪ViewState错误?我也无法重现我在日志文件中有时看到的错误。感谢分享! - ThdK

2
这个问题的常见原因是用户在执行引起后台回发的操作之前没有等待整个页面渲染完毕。页面有多大?用户是否变得不耐烦?
我还看到另一个地方出现了这个问题,那就是重复器/模板控件中带有后台回发控件,比如在重复器的项模板中放置的一个按钮 -- 在回发后错误地进行数据绑定而不是只绑定一次。但是,这种情况会一直失败,所以似乎不太可能。
我不确定如何从异常中获取更多信息......你是如何首先捕获它的?当这个异常发生时,我认为 Page 对象本身根本没有被实例化,所以你可能需要使用一个自定义的 HttpModule。能否在 ProcessRequest 周围加上 try/catch?那样你应该可以访问 Request 对象和已提交的数据。

该页面并不是很大,只有470K,或者对于一个已经缓存的页面来说只有78K(根据YSlow)。我正在全局.asax Application_Error中记录异常,这让我可以从HttpContext.Current.CurrentHandler和Server.GetLastError()中获取信息,以便查看错误来自哪个页面。 - Chris Marisic
你准确地提到了我在一个项目中遇到的真正问题,这并没有在大量涉及这个错误的文章和帖子中提到,谢谢你。 - Kasrak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接