2010-07-31 22 views
4

不费一枪我有ASP.NET设置为使用的customErrors功能:ASP.NET的customErrors当异常发生在Global.asax中或在web.config中

<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黄色死亡屏幕,并带有以下消息:

'/ MvcErrorHandling'应用程序中的服务器错误。
运行时错误
描述:服务器上发生应用程序错误。此应用程序的当前自定义错误设置可防止查看应用程序错误的详细信息。

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

预先感谢任何输入:)

+0

您使用的是哪个版本的IIS? – 2010-07-31 03:59:00

+0

@Nick:IIS 7.5。 – 2010-07-31 09:34:47

回答

1

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

最简单的选择是让你的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. 错误页面中的错误。
+1

即使使用静态HTML文件,ASP.NET也不会在500个错误上呈现我的自定义错误页面。它完全忽略了指令,而是呈现自己的“运行时错误”YSOD页面。 – 2011-05-04 13:56:14

相关问题