2013-02-07 12 views
1

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

场景:ASP.NET WebForms应用程序。其中一个页面有一个带有提交按钮的UpdatePanel。该页面正常工作。但是如果我走开一段时间(似乎是30-60分钟),然后回来点击提交按钮,什么都不会发生;没有错误,页面没有响应 - 什么都没有。在调试器中运行时,我一直无法实现这一点;它只发生在IIS(7.5)中时。 [我见过有关此问题的其他SO帖子,但没有任何建议适用于我。]

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

我试图通过将错误记录到数据库来捕获Page_Error中的错误,但那也不起作用。我知道Page_Error和DB部分正在工作,因为如果我改变后面的提交代码以除以零来分隔,错误就会记录在数据库中。此外,零差错将显示给客户端,客户=关闭,并在它上面将显示自定义错误页面。但是除去零除错误,然后等待30分钟左右再次尝试,即使它重定向到自定义错误页面,Page_Error代码也没有被击中。然后,我尝试将Page_Error中的代码移动到Application_Error,但同样的事情发生。由错误强制划分的作品,但这看似超时相关的错误并没有。

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

+1

我在AJAX更新中调用的代码中有类似的错误。 Elmah能够捕捉到这个例外。我相信它也可以使用ASP.NET Health Monitoring进行查看。最后,我实际上收到了AJAX错误和异常消息。 –

+1

如果错误在IIS到达ASP.NET执行管道之前由IIS处理,则无法在代码中捕获它。是否有可能IIS进程被回收或会话超时?在IIS中启用失败的请求跟踪,可能会为您提供有关失败的更多信息。 – Sergey

回答

1

谢谢约翰和谢尔盖!这真的是一堆蠕虫。谢尔盖,你完全正确 - 会议超时。约翰的想法让我想到了Windows应用程序事件日志,而不是试图在代码中追踪它。事实证明,当会话超时时,我的ViewState即将过期,默认设置为20分钟。确切的事件日志错误是:

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

现在我能够手动回收应用程序池并强制错误发生在我的闲暇时间,这使得解决问题变得更容易。尽管我没有使用Session,但至少在页面上没有问题,那为什么这么做呢?此链接有助于解决发生的问题。

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

深埋入文章是描述导致工作进程循环的情形下句:

“应用程序池下比在本地系统帐户之外的身份,网络运行服务帐户或管理级帐户。“

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

+0

尽管我解决了潜在的问题,但我并没有真正回答我原来的问题,这就是为什么Application_Error没有被触发?我相信这是因为当ViewState无效时,继续运行服务器端代码会带来安全风险,因此IIS会跳过它,但仍然有重定向到自定义错误页面的良好意义。所以是的,某些错误不会触发正常的错误流程。 – TTT

相关问题