【发布时间】:2018-08-31 19:41:59
【问题描述】:
我有一个 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() 方法就会触发。如果我把它放回去,它不会。在我的本地机器上它总是工作,当我把它推到天蓝色时,它停止工作。
【问题讨论】:
-
为什么不简单地生成一个错误: throw new Exception(...)
-
如果您在服务器上使用浏览器,即在本地,您将获得更多的调试输出
标签: c# asp.net asp.net-mvc asp.net-mvc-5