[ASP.NET] 自訂網站 Exception 錯誤導向處理

摘要:[ASP.NET] 自訂網站 Exception 錯誤導向

前言


  最近看到一些專案對於當網站發生錯誤的處理並沒有很恰當,讓使用者操作系統發生錯誤時會看到一片黃色畫面的錯誤訊息會讓使用者的觀感不好,所以我們可以透過自行處理錯誤導向的方式客製化錯誤訊息的頁面,例如放個花花草草之類的畫面 (笑),接下來請看範例該如何處理吧。

 

範例


首先需要在 Web.config 內加入一段結構描述,如下。

    <system.web>
        <customErrors mode="RemoteOnly" 
                redirectMode="ResponseRewrite" 
                defaultRedirect="Error.htm" />
    </system.web>

參數說明

  • mode指定是否啟用、停用,或是只對遠端用戶端顯示自訂錯誤。
  1. On:啟用自訂錯誤,但若未指定defaultRedirect時,不管用戶端或本機都將顯示 ASP.NET 錯誤訊息畫面。
  2. Off:停用自訂錯誤,不管用戶端或本機都將顯示 ASP.NET 錯誤訊息畫面。
  3. RemoteOnly:只對遠端用戶端啟用自訂錯誤,本機端顯示 ASP.NET 錯誤訊息。 (預設值)
  • redirectMode:決定當自訂錯誤頁面顯示時要如何處理原始要求的 URL。
  1. ResponseRedirect:導向 URL 不同於原始 WEB 要求 URL。
  2. ResponseRewrite:導向 URL 必須同於 WEB 要求 URL。
  • defaultRedirect指定發生錯誤時,要將瀏覽器導向至的預設 URL。 若是沒有指定這個屬性,就會顯示泛型錯誤。

 

  一般在開發時期 mode 會設定成 Off 或 RemoteOnly ,但是當正式上線後應將 mode 設定成 On ,當用戶端發生錯誤時一律顯示自訂錯誤頁面讓用戶端看到,對於自訂錯誤其實還有個 <error ...> 屬性可以設定 StatusCode 來導向哪個錯誤頁面,但由於之前這種導向方式會發生資安漏洞,所以如果有使用 <error .. > 來作導向的話就會被資安掃描軟體判定為高風險問題,所以在此不使用這種做法處理。(詳細可參考保哥的 ASP.NET 發現重大資安弱點影響範圍涵蓋 ASP.NET 1.0 ~ 4.0)

 

  當 Web.Config 設定好 customErrors 的屬性後就可以開始自訂錯誤頁面了, 在這裡可以配合使用全域應用程式類別(Global.asax)來捕捉例外處理,一般我會在此捕捉發生錯誤的例外後再寫入 Log 紀錄並導向對應的錯誤頁面,如下。

//Global.asax

void Application_Error(object sender, EventArgs e) 
{ 
    // 發生未處理錯誤時執行的程式碼

    var error = Server.GetLastError();
    LogHelper.WriteLog(error);
    Server.Transfer("~/ErrorPage/error.htm");
}

 

最後只需要拉個 HTML 的錯誤畫面網頁即可就完成了。

 

範例程式碼


TError.rar

參考資料


customErrors 項目 (ASP.NET 設定結構描述)

HttpServerUtility.GetLastError 方法

IIS 7.0、IIS 7.5,及 IIS 8.0 的 HTTP 狀態碼

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)