【问题标题】:How to trap an ASP.NET error which triggers Custom Error Page, but not Application_Error如何捕获触发自定义错误页面但不触发 Application_Error 的 ASP.NET 错误
【发布时间】:2013-01-22 09:43:53
【问题描述】:

我有一个使用自定义错误的 ASP.NET 应用程序。发生了一个错误,我似乎无法获得任何信息。当错误发生时,它会触发自定义错误页面,但由于某种原因它不会触发 Page_Error 或 Application_Error。如果我完全关闭 CustomErrors,我绝对不会得到任何反馈。到目前为止,我得到的唯一反馈是重定向到自定义错误页面。

场景:ASP.NET WebForms 应用程序。其中一个页面有一个带有提交按钮的 UpdatePanel。该页面工作正常。但是如果我走开一会儿(似乎是 30-60 分钟)然后回来点击提交按钮,什么也没有发生;没有错误,页面没有响应 - 什么都没有。在调试器中运行时,我无法做到这一点;仅当它托管在 IIS (7.5) 中时才会发生。 [我看过其他关于这个问题的 SO 帖子,但没有一个建议对我有用。]

当错误发生时,使用 CustomErrors=On 或 RemoteOnly,重定向到自定义错误页面有效,而使用 RemoteOnly,从服务器,我根本没有收到任何反馈,类似于使用 customerrors=off 的远程连接。我真的很希望看到 YSOD 错误页面。

我尝试通过将错误记录到数据库来捕获 Page_Error 中的错误,但这也不起作用。我知道 Page_Error 并且 DB 部分正在工作,因为如果我将后面的提交代码更改为除以零,则错误会记录在 DB 中。此外,除以零错误将显示给客户端,customerrors=off,并显示自定义错误页面。但是删除除以零错误,然后等待 30 分钟左右再试一次,Page_Error 代码没有被命中,即使它确实重定向到自定义错误页面。然后我尝试将 Page_Error 中的代码移动到 Application_Error,但发生了完全相同的事情。强制除以错误有效,但这个看似超时相关的错误无效。

那么,是否有某些错误仍然可以触发重定向到自定义错误页面,但不会触发 Application_Error 事件?

【问题讨论】:

  • 我在从 AJAX 更新调用的代码中遇到了类似的错误。 Elmah 能够捕捉到异常。我确信使用 ASP.NET Health Monitoring 也可以看到它。最后,我实际上收到了带有异常消息的 AJAX 错误。
  • 如果错误在到达 ASP.NET 执行管道之前由 IIS 处理,则无法在代码中捕获它。 IIS进程是否可能被回收或会话超时?在 IIS 中启用失败的请求跟踪,它可能会为您提供有关失败的更多信息。

标签: asp.net application-error


【解决方案1】:

谢谢约翰和谢尔盖!这真的是一罐蠕虫。谢尔盖,你完全正确——会话超时。约翰,您的想法让我想到查看 Windows 应用程序事件日志,而不是试图在代码中追踪它。原来我的 ViewState 在会话超时时过期,默认设置为 20 分钟。确切的事件日志错误是:

“视图状态验证失败。原因:视图状态提供的完整性检查失败。”

现在我能够手动回收应用程序池,并在空闲时强制错误发生,这使得解决问题变得更加容易。不过,我没有使用 Session,至少没有在相关页面上使用,那为什么这很重要?此链接有助于解决所发生的问题。

http://support.microsoft.com/default.aspx?scid=kb;en-us;829743

这篇文章的深处是以下句子,描述了导致工作进程回收的场景:

“应用程序池正在以本地系统帐户、网络服务帐户或管理级别帐户以外的身份运行。”

我的 AppPool 实际上是在我专门为此目的创建的本地用户帐户下运行的。当我将 AppPool 更改为使用 ApplicationPoolIdentity 运行时,在回收 AppPool 后,ViewState 错误消失了。然后我将 AppPool 重新设置为使用本地用户帐户运行,赋予该帐户本地管理员权限,这也修复了它。不想让这个用户成为本地管理员,我最终选择了一个不同的解决方案,即为这个应用程序生成一个机器密钥,这样 ViewState MAC 总是相同的,而不是使用默认的自动生成一个新的每次池回收或会话超时时。请注意,如果您在负载均衡器后面有多个 Web 服务器,这也是您通常需要执行的操作。

【讨论】:

  • 尽管我解决了根本问题,但我并没有真正回答我原来的问题,这就是为什么 Application_Error 没有被触发?我相信这是因为当 ViewState 无效时,继续运行服务器端代码存在安全风险,因此 IIS 跳过它,但仍然有很好的意义重定向到自定义错误页面。所以是的,某些错误不会触发正常的错误流程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 1970-01-01
  • 2010-10-17
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
相关资源
最近更新 更多