標籤:style class blog code http tar
要在ASP.NET中處理好自訂錯誤(Custom Errors)首先要拋棄使用web.config\customErrors。
<customErrors mode="RemoteOnly" defaultRedirect="/error/error.htm"> <error statusCode="404" redirect="/error/404.htm" /></customErrors>
使用web.config\customErrors最大的一個缺點是在顯示自訂錯誤頁面時會重新導向:
http://www.cnblogs.com/error/error.htm?aspxerrorpath=/cmt/p/3789549.html
這會帶來2個麻煩:
1. 會造成使用者反饋問題時提供的是重新導向後的URL。
2. 會造成使用者無法通過重新整理瀏覽器進行重試,或者問題解決後通過重新整理瀏覽器恢複正常。
我們目前想到的最佳處理方式是在Global.asax.cs的Application_Error中進行處理。
代碼如下:
protected void Application_Error(Object sender, EventArgs e){ Exception lastError = Server.GetLastError(); if (lastError != null) { if (lastError is HttpException) { if (((HttpException)lastError).ErrorCode == 404) { Response.StatusCode = 404; Server.ClearError(); return; } } CNBlogs.Infrastructure.Logging.Logger.Default.Error("Application_Error", lastError); Response.StatusCode = 500; Server.ClearError(); }}
由於我們在IIS中指定了404/500錯誤的自訂錯誤頁面,所以這裡只需要返回狀態代碼(需要IIS 7.0以上)。
這樣處理後,還可以方便地在顯示自訂錯誤之前記錄到log4net日誌。
另外需要注意的是一定要Server.ClearError(),不然ASP.NET會根據web.config\customErrors進行繼續處理(代碼中的自訂錯誤處理就會失效),錯誤資訊也會被記錄到Windows日誌(既然我們已經記錄到了log4net日誌,就沒必要再記錄到Windows日誌)。
你也許會問,幾行代碼就能解決的如此簡單的問題,值得興師動眾寫篇部落格還要發在首頁?
值!因為之前我們沒有認真對待這個地方的問題,多次為此付出了代價。也許園子裡還有人沒有注意這個地方的問題。
踩自己的坑,寫自己的部落格,然後讓別人無坑可踩,我想這也是寫部落格的一個價值體現吧。