在global.asax或web.config中发生异常时,不会触发ASP.NET CustomErrors

时间:2010-07-31 03:51:36

标签: asp.net exception-handling error-handling

我已将ASP.NET设置为使用CustomErrors功能:

<customErrors mode="On" defaultRedirect="~/ErrorPages/500.aspx" redirectMode="ResponseRewrite">
    <error statusCode="404" redirect="~/ErrorPages/404.aspx" />
    <error statusCode="500" redirect="~/ErrorPages/500.aspx" />
</customErrors>

一切都很好,并在适当的时候显示相关的错误页面。

以下两种情况除外:

1)global.asax时抛出异常:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        throw new ApplicationException("Exception in Application_Start()");
    }
}

2)web.config

时出现语法错误

在这两种情况下,我都看不到我漂亮的500.aspx页面。相反,我看到死亡的标准ASP.NET黄色屏幕,并带有以下消息:

     说明:服务器上发生应用程序错误。此应用程序的当前自定义错误设置可防止查看应用程序错误的详细信息。

在上述两种情况下,如何让ASP.NET或IIS显示自定义错误页面(一个漂亮的错误页面,而不是YSOD)?

提前感谢任何输入:)

1 个答案:

答案 0 :(得分:1)

问题是这些特定错误是在ASP.NET加载之前发生的,而“500内部服务器错误”页面是一个需要ASP.NET加载的.aspx页面。

最简单的选择是将您的500页设为HTML页面,但这意味着您无法从那里进行简单的错误记录等。

这可能仍然无法帮助web.config场景,好像IIS无法处理web.config,无法保证它会读取您的错误部分。

另一种选择是告诉IIS提供500个错误的静态html页面。

最后,您可以尝试在web.config中的Application_Error事件中捕获错误 - 这至少可以让您处理错误,即使您尝试显示的页面无法加载。


编辑以添加

如果您在集成模式下运行IIS 7,如果您将错误页面的响应代码设置为500,则需要再做一件事:

Response.TrySkipIisCustomErrors = true;

但请注意,以下条件将停止显示任何自定义500错误页面,从而产生YSOD:

  1. web.config中的错误或web.config中的某些处理程序在管道的其余部分之前触发(即原始答案的大部分)
  2. 错误页面中的错误。