2010-07-31 27 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

相關問題