在開發Asp.Net系統的時候,我們很多時候希望系統發生錯誤后能夠跳轉到一個自定義的錯誤頁面,於是我們經常會在Global.asax中的Application_Error方法中使用Response.Redirect方法跳轉到自定義錯誤頁,但有時候(特別是當站點部署到IIS后)Application_Error方法中使用Response.Redirect方法會失效,當Asp.Net發生異常錯誤后還是顯示出來的是Asp.Net的默認錯誤黃頁。其根本原因是盡管我們在Application_Error方法中使用了Response.Redirect方法,但是當系統發生異常錯誤后Asp.Net認為異常並沒有被處理,所以Asp.Net不會跳轉到Application_Error方法中Response.Redirect指向的頁面,還是會最終會跳轉到Asp.Net的默認錯誤黃頁。解決這個問題的辦法很簡單就是在Application_Error方法中使用Response.Redirect做跳轉前,先調用Server.ClearError()方法告訴Asp.Net系統發生的異常錯誤已經被處理了,這樣再調用Response.Redirect方法系統就會跳轉到自定義錯誤頁面了。
下面是一段示例代碼:
1 using System; 2 using System.Web; 3 using System.Web.Mvc; 4 using System.Web.Routing; 5 using System.Web.Http; 6 7 namespace RedirectToErrorPage 8 { 9 public class Global : HttpApplication 10 { 11 void Application_Start(object sender, EventArgs e) 12 { 13 // Code that runs on application startup 14 AreaRegistration.RegisterAllAreas(); 15 GlobalConfiguration.Configure(WebApiConfig.Register); 16 RouteConfig.RegisterRoutes(RouteTable.Routes); 17 } 18 19 //盡管我們在Global.asax的Application_Error方法中使用了Response.Redirect方法做頁面重定向,但是當系統發生錯誤時Asp.Net認為錯誤沒有被處理,所以最后頁面還是會被重定向到Asp.Net的默認錯誤黃頁,而不會跳轉到我們在Application_Error方法中用Response.Redirect指向的頁面。 20 protected void Application_Error(object sender, EventArgs e) 21 { 22 Server.ClearError();//在Global.asax中調用Server.ClearError方法相當於是告訴Asp.Net系統拋出的異常已經被處理過了,不需要系統跳轉到Asp.Net的錯誤黃頁了。如果想在Global.asax外調用ClearError方法可以使用HttpContext.Current.ApplicationInstance.Server.ClearError()。 23 Response.Redirect("~/ErrorPage.html", true);//調用Server.ClearError方法后再調用Response.Redirect就可以成功跳轉到自定義錯誤頁面了 24 } 25 }