概述ASP.NET錯(cuò)誤處理
要?jiǎng)?chuàng)建頁(yè)中的全局處理程序,請(qǐng)創(chuàng)建 Page_Error 事件的處理程序。要?jiǎng)?chuàng)建ASP.NET應(yīng)用程序范圍的錯(cuò)誤處理程序,請(qǐng)?jiān)?Global.asax 文件中將代碼添加到 Application_Error 方法。只要您的頁(yè)或應(yīng)用程序中發(fā)生未處理的異常,就會(huì)調(diào)用這些方法。您可以從 HttpServerUtility.GetLastError 方法獲取有關(guān)最新錯(cuò)誤的信息。
注意 如果您具有全局錯(cuò)誤處理程序,則它優(yōu)先于在 Web.config customErrors 元素的 defaultRedirect 屬性中指定的ASP.NET錯(cuò)誤處理。
原則(MSDN):在您的應(yīng)用程序顯示錯(cuò)誤信息時(shí),它不應(yīng)該泄露有助于惡意用戶攻擊您系統(tǒng)的信息。例如,如果您的應(yīng)用程序試圖登錄數(shù)據(jù)庫(kù)時(shí)沒(méi)有成功,則顯示的錯(cuò)誤信息不應(yīng)該包括它正在使用的用戶名。
有許多方法可以控制錯(cuò)誤信息:
將應(yīng)用程序配置為不向遠(yuǎn)程(應(yīng)用程序)用戶顯示詳細(xì)錯(cuò)誤信息。您也可以選擇將錯(cuò)誤重定向到應(yīng)用程序頁(yè)。
只要可行就包括ASP.NET錯(cuò)誤處理,并編寫您自己的錯(cuò)誤信息。在您的錯(cuò)誤處理程序中,您可以進(jìn)行測(cè)試以確定用戶是否為本地用戶并作出相應(yīng)的響應(yīng)。
在捕捉所有未處理異常并將它們發(fā)送到一般錯(cuò)誤頁(yè)的頁(yè)級(jí)別或應(yīng)用程序級(jí)別上,創(chuàng)建全局錯(cuò)誤處理程序。這樣,即使您沒(méi)有預(yù)料到某個(gè)問(wèn)題,至少用戶不會(huì)看到異常頁(yè)。
一.頁(yè)面級(jí)的ASP.NET錯(cuò)誤處理
- voidPage_Error(Objectsender,EventArgse){
- Stringmessage="<fontface=verdanacolor=red>"
- +"<h4>"+Request.Url.ToString()+"</h4>"
- +"<pre><fontcolorfontcolor='red'>"+Server.GetLastError().ToString()+"</pre>"
- +"</font>";
- Response.Write(message);
- Server.ClearError();
- }
注:通過(guò)使用 Server 對(duì)象訪問(wèn)來(lái)自服務(wù)器的錯(cuò)誤信息。特別地,該示例從 Request 對(duì)象獲取請(qǐng)求的 URL,以及 Server 對(duì)象的最新錯(cuò)誤(使用 GetLastError 方法),并將這兩者都轉(zhuǎn)換為客戶端可以顯示的字符串。將 message 變量寫入客戶端后,通過(guò)使用 ClearError 方法刪除該錯(cuò)誤
二.應(yīng)用程序級(jí)的錯(cuò)誤事件中
錯(cuò)誤處理方式如下:global.asax文件中的application_error中添加處理 邏輯,可添加其它操作,如寫入windows事件日志,發(fā)郵件給管理員,將錯(cuò)誤信息寫入數(shù)據(jù)庫(kù)。具體如下:
- protectedvoidApplication_Error(Objectsender,EventArgse)
- {
- StringMessage="\n\nURL:\nhttp://localhost/"+Request.Path
- +"\n\nMESSAGE:\n"+Server.GetLastError().Message
- +"\n\nSTACKTRACE:\n"+Server.GetLastError().StackTrace;
- //寫入windows事件日志
- StringLogName="Application";
- if(!EventLog.SourceExists(LogName))
- {
- EventLog.CreateEventSource(LogName,LogName);
- }
- EventLogLog=newEventLog();
- Log.Source=LogName;
- Log.WriteEntry(Message,EventLogEntryType.Error);
- }
三.web.config中,自定義錯(cuò)誤信息。將應(yīng)用程序配置為不向遠(yuǎn)程用戶顯示錯(cuò)誤
- <customErrors mode="RemoteOnly" defaultRedirect="AppErrors.aspx">
- <error statusCode="404" redirect="NoSuchPage.aspx"/>
- <error statusCode="403" redirect="NoAccessAllowed.aspx"/>
- </customErrors>
注:將 mode 屬性設(shè)置為 RemoteOnly(區(qū)分大小寫)。這就將應(yīng)用程序配置為僅向本地用戶(您和開(kāi)發(fā)人員)顯示詳細(xì)的錯(cuò)誤。
(可選)包括指向應(yīng)用程序錯(cuò)誤頁(yè)的 defaultRedirect 屬性。
(可選)包括將錯(cuò)誤重定向到特定頁(yè)的 error 元素。例如,您可以將標(biāo)準(zhǔn) 404 錯(cuò)誤(未找到頁(yè))重定向到您自己的應(yīng)用程序頁(yè)。
四.包括ASP.NET錯(cuò)誤處理 (MSDN)
1.在可能產(chǎn)生錯(cuò)誤的任何語(yǔ)句前后使用 try-catch-finally 塊。
2.(可選)使用 Context 對(duì)象的 UserHostAddress 屬性對(duì)本地用戶進(jìn)行測(cè)試并相應(yīng)地修改錯(cuò)誤處理。值 127.0.0.1 等效于“l(fā)ocalhost”并指示瀏覽器與 Web 服務(wù)器位于同一臺(tái)計(jì)算機(jī)上。
下面顯示的是一個(gè)示例錯(cuò)誤處理塊。如果發(fā)生錯(cuò)誤,則用有關(guān)消息的詳細(xì)信息加載 Session 狀態(tài)變量,然后應(yīng)用程序顯示可以讀取 Session 變量并顯示錯(cuò)誤的頁(yè)。(有意寫入此錯(cuò)誤以便不向用戶提供任何可利用的詳細(xì)信息。)如果用戶是本地用戶,則提供不同的錯(cuò)誤詳細(xì)信息。在 finally 塊中,釋放開(kāi)放式資源。
- try
- {
- sqlConnection1.Open();
- sqlDataAdapter1.Fill(dsCustomers1);
- }
- catch (Exception ex)
- {
- if(HttpContext.Current.Request.UserHostAddress == "127.0.0.1")
- { Session["CurrentError"] = ex.Message; }
- else
- { Session["CurrentError"] = "Error processing page."; }
- Server.Transfer("ApplicationError.aspx");
- }
- finally
- {
- this.sqlConnection1.Close();
- }
【編輯推薦】