Application_Error()不会触发

时间:2018-08-31 19:42:00

标签: c# asp.net asp.net-mvc asp.net-mvc-5

我有一个MVC 5应用程序,我试图捕获任何未捕获的错误。为此,我在Global.asax.cs中创建了一个方法,如下所示:

protected void Application_Error()
{
    MyLogger.Log("some text");
}

当我在本地运行项目时,此方法会针对404、500等触发。但是,当我将应用程序切换到Release并将其放在服务器上时,它可以处理404,但不再处理500。我创建了一种抛出诸如此类的错误的方法:

[HttpGet]
[AllowAnonymous]
public string Error()
{
    var s = int.Parse("hello abc 123");

    return "Hello World";
}

课程方法崩溃,因为它无法将文本转换为int,但Application_Error()不会触发。如果我尝试访问一个不存在的页面,它将触发并在日志中看到它。

我看过web.config,在生产环境中就是这样:

<customErrors mode="On" defaultRedirect="~/Error/Index"></customErrors>

此外,在filter.config中,我有:

filters.Add(new HandleErrorAttribute());

如果我在上面的那条评论,我的Application_Error激活,我可以看到日志。但是,该页面不再重定向到我的自定义错误页面。取而代之的是,我出现了以下消息的白屏:

  

由于发生内部服务器错误,因此无法显示该页面。

我的问题是:

当我使用上述web.config设置将网站投入生产时,为什么网站停止处理404错误。如何使其捕获这些错误?

编辑:我将问题归结为:如果我注释掉HandleError属性,那么我的Application_Error()方法将触发。如果我放回去,它不会。在我的本地计算机上,它总是可以工作,当我将其推到天蓝色时,它就会停止工作。

1 个答案:

答案 0 :(得分:0)

HandleError属性将触发,因此Application_Error将不会触发。由于HandleException是MVC管道的一部分,它将处理该错误并防止引发该错误。之所以对我来说一直在本地工作,是因为我在web.config中有debug="off"

所以我的解决方案是要么不使用HandleError异常,要么编写一个自定义的扩展并记录日志。