網站的工作(tasks),大多在處理 request 與 response 之間的請求,這機制系統會自動幫我們處理。 但是,還有一些比較不一樣的工作,就必須自行撰寫程式碼,以便處理 ASP.NET 與 IIS 的溝通,例如:
- 網頁的例外處理
- 網頁的組態設定
- 網頁的非同步作業
- 自訂 HTTP Handler
Page 和 Application 的錯誤處理
通常我們會在 Try/Catch 補捉並且記錄例外狀況, 但是如果例外狀況不是發生在這個區塊中,那麼就可以使用自訂的處理統一補捉這些錯誤,避免用戶端發生網頁錯誤。 錯誤處理可分成網頁層級或應用程式層級的錯誤
網頁層級的錯誤
若要預防網頁層級的錯誤,可以在網頁中建立 Page_Error 事件處理常式。
- Server.GetLastError :傳回先前的例外狀況。
- Server.ClearError :清除先前的例外狀況。
private void Page_Error(object sender, EventArgs e) { // 擷取錯誤 Exception ex = Server.GetLastError(); string ErrorMessage = ex.Message; // 處理錯誤 Trace.Write("ERROR: " + ErrorMessage); myDebug.WriteLine("ERROR: " + ErrorMessage); myDebug.ResponseBR("ERROR: " + ErrorMessage); Literal1.Text = ErrorMessage; // 清除錯誤 Server.ClearError(); }
處理完錯誤之後,可叫用 ClearError 清除 Error 或導向錯誤頁面,要不然錯誤還是會反應到網頁上。
應用程式層級的錯誤
若發生 Exception 的網頁沒有補捉該例外的話,則這個 Exception 則會觸發 global.asax 的 Application_Error 事件。
通常可以在這個事件中記錄 ErrorLog ,再導到共同的錯誤頁面。 或者直接在此使用 Server.Transfer ,將整個 Page 資訊都丟給共同的錯誤頁面去處理。
protected void Application_Error(object sender, EventArgs e) { Server.Transfer("~/ErrPage.aspx"); }
public partial class ErrPage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 擷取錯誤 Exception ex = Server.GetLastError().GetBaseException(); // 處理錯誤 ErrorPage ErrPage = new ErrorPage(); ErrPage.ErrUrl = Request.ServerVariables["HTTP_REFERER"]; if (ex != null) { ErrPage.ErrMessage = ex.Message; Server.ClearError(); } // 輸出錯誤 litErrUrl.Text = ErrPage.ErrUrl; litErrMsg.Text = ErrPage.ErrMessage; } } } public class ErrorPage { public string ErrUrl { get; set; } public string ErrMessage { get; set; } }
自訂錯誤頁面
當系統發生錯誤發生時,若不希望讓使用者看到錯誤訊息,就可以透過自訂錯誤頁面提供訊息來指引使用者進行下一個步驟。 要處理這樣子的設定,也可以分成針對單一網頁,或整個網站來設定。
1.網頁層級的設定
透過 Page 的 ErrorPage 屬性,可以指定錯誤發生時的導向頁面。
<%@ Page Language="C#" ErrorPage="~/ErrPage.aspx"%>
2.應用程式層級的設定(套用至整個網站)
<customErrors mode="On" defaultRedirect="~/ErrPage.aspx" />
- defaultRedirect :指定發生錯誤時,要將瀏覽器導向至的預設 URL。
- mode :顯示錯誤訊息模式
- On :啟用自訂錯誤。可在用戶端和本機端顯示自訂的錯誤說明。
- Off:停用自訂錯誤。可在用戶端和本機端顯示 ASP.NET 的錯誤說明。
- RemoteOnly:在用戶端顯示自訂的錯誤,在本機端顯示 ASP.NET 的錯誤。(預設值)
使用 RedirectMode 屬性
CustomErrors 的 RedirectMode 屬性是 ASP.NET 3.5 SP1 之後才加入的屬性,它可以用來設定當使用者被重新導向至自訂的錯誤頁面時,是否要變更其原始的 URL 。 其設定格式如下:
- ResponseRedirect :導向後的 URL 為錯誤頁面的網址,不同於原先的網址一樣。
- ResponseRewrite :導向後的 URL 會被重寫和原先的網址一樣。
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/ErrPage.aspx" />
依錯誤狀態碼,自訂錯誤頁面
每一個錯誤都有一個錯誤狀態碼(HTTP status codes),當自訂錯誤頁面時,也可以針對不同的錯誤狀態碼,指定特定的錯誤頁面。
<customErrors defaultRedirect="~/ErrPage.aspx" mode="On"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors>
沒有留言:
張貼留言