Application_Error 未记录错误

Posted

技术标签:

【中文标题】Application_Error 未记录错误【英文标题】:Error is not logged with Application_Error 【发布时间】:2013-01-30 08:50:43 【问题描述】:

我有一个 Asp.Net 4.0 Web Forms 应用程序在某些时候会引发以下错误

“‘/MySiteDev’应用程序中的服务器错误”。

这个错误只是偶尔出现。而且此错误不会触发在Global.asax 中处理的Application_Error 事件。

既然这没有触发 Application_Error,那么还有哪些其他可能的地方会记录此错误事件的日志?除了事件查看器还有什么可用的?

有什么方法可以找出 ASP.Net 框架处理的异常?

注意:customErrors mode="Off"。还有runAllManagedModulesForAllRequests="true"

更新

来自How to: Handle Application-Level Errors的参考

在 Global.asax 文件中定义的错误处理程序将仅捕获在 ASP.NET 运行时处理请求期间发生的错误。例如,如果用户请求在您的应用程序中没有出现的 .aspx 文件,它将捕获错误。但是,如果用户请求不存在的 .htm 文件,它不会捕获错误。对于非 ASP.NET 错误,您可以在 Internet 信息服务 (IIS) 中创建自定义处理程序。服务器级错误也不会调用自定义处理程序。

您不能直接输出来自 Global.asax 文件的请求的错误信息;您必须将控制权转移到另一个页面,通常是 Web 窗体页面。将控制权转移到另一个页面时,使用 Transfer 方法。这会保留当前上下文,以便您可以从 GetLastError 方法获取错误信息。

处理错误后,必须通过调用Server对象(HttpServerUtility类)的ClearError方法来清除它。

代码

    protected void Application_Error(object sender, EventArgs e)
    
        //Get the exception object
        Exception exception = Server.GetLastError().GetBaseException();

        //Get the location of the exception
        string location = Request.Url.ToString();
        if (!String.IsNullOrEmpty(location))
        
            string[] partsOfLocation = location.Split('/');
            if (partsOfLocation != null)
            
                if (partsOfLocation.Length > 0)
                
                    location = partsOfLocation[partsOfLocation.Length - 1];
                
            

            //Maximum allowed length for location is 255
            if (location.Length > 255)
            
                location = location.Substring(0, 254);
            
        

        string connectionString = ConfigurationManager.ConnectionStrings[UIConstants.PayrollSQLConnection].ConnectionString;
        ExceptionBL exceptionBL = new ExceptionBL(connectionString);

        exceptionBL.SubmitException(exception.Message, location);
        Log.Logger.Error(exception.Message);

    

配置

<system.web>

<compilation debug="true" targetFramework="4.0" />
<pages validateRequest="false"></pages>
<httpRuntime requestValidationMode="2.0" />
<customErrors mode="Off"/>
<authentication mode="Windows"></authentication>
<identity impersonate="true" userName="domain\xxxx" password="xxxx"/>

</system.web>

<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<httpErrors errorMode="Detailed" />
</system.webServer>

更新的参考文献

    Application_Error not firing Global.asax event Application_Error is not firing Application_Error does not fire? How to: Handle Application-Level Errors

【问题讨论】:

【参考方案1】:

检查事件查看器中的日志,它应该记录服务器级和应用程序级错误。

应用程序错误处理程序可能没有处理该事件,因为它发生在您的应用程序成功启动并创建上下文之前。因此,似乎有应用程序配置或服务器配置停止处理请求。

或者,应用程序在请求生命周期的早期就遇到了问题,即使在启动之后,它也会“挂起”,直到服务器决定终止进程(例如,可能以 @MikeSmithDev 提到的 ***Exception 的形式出现) .

【讨论】:

打败我!另外,可能是 ***Exception... 我有兴趣从事件日志中查看 OP 详细信息。 @MikeSmithDev 以下文章说“无论是“***”异常还是“404 Not found”,它都会以 Application_Error 结束。”你是说这个说法不正确吗? *** exception 不会被 Application_Error 捕获? totaldotnet.com/Article/ShowArticle58_GlobleErrorHandle.aspx @Lijo 是的,这就是我要说的。我刚刚测试了你的代码。它捕获了一个常规异常。当我发生 ***Exception 时它没有捕捉到它。 Try/Catch 也无法捕获它们。相应的进程立即终止。如果这种情况发生太多、太频繁,app_pool 将被关闭,并且您的网站基本上会死掉,直到您回收它。 @MikeSmithDev 您如何看待我添加的答案?请就您的想法发表评论。 您对我添加的答案有何看法?请就您的想法发表评论。【参考方案2】:

这是一个带有 A 和 B 框的 load balanced 环境。

部署 Web 应用程序的团队确认,在其中一个框中,配置文件未正确复制。

我认为,应用程序在击中 A 框并在 B 框失败时运行良好。我认为,由于配置不存在,因此无法调用Application_Error

如果你有不同的意见,请说出来。

注意:重新部署时问题不存在

【讨论】:

以上是关于Application_Error 未记录错误的主要内容,如果未能解决你的问题,请参考以下文章

当 customerrors = "On" 时,Application_Error 未触发

Asp.net mvc 在基本控制器中覆盖 OnException 不断传播到 Application_Error

ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常

Global.asax中的Application_Error事件不执行

ASP.NET 错误处理

ASP.NET MVC 自定义错误处理 Application_Error Global.asax?