1

我有一个使用自定义错误的 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 事件?

4

1 回答 1

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 服务器,这也是您通常需要做的事情。

于 2013-02-07T04:00:30.653 回答