ASP.NET中的錯誤處理支持
發表于:2007-09-07來源:作者:點擊數:
標簽:
ASP.NET具有一個很好的新功能:它對運行時間錯誤的處理和跟蹤提供了豐富支持。特別是,它為管理人員提供了一種很簡單的方法,可以保證那些令人恐懼的“ASP 43433ax”十六進制形式的錯誤永遠也不會被顯示到客戶面前。相反,它允許顯示一個較為定制化的信息,比
ASP.NET具有一個很好的新功能:它對運行時間錯誤的處理和跟蹤提供了豐富支持。特別是,它為管理人員提供了一種很簡單的方法,可以保證那些令人恐懼的“ASP 43433ax”十六進制形式的錯誤永遠也不會被顯示到客戶面前。相反,它允許顯示一個較為定制化的信息,比如“對不起,這個站點不可用”。ASP.NET還提供了一種強大的方法,使
開發人員可以對他們的代碼進行裝備,向管理人員提供發生在工作站點問題的額外信息與通知。本文詳細介紹了這兩種技術,同時在結尾包括了一個樣本代碼,你可以直接使用它試驗一下。 確保不會泄露
安全信息 ASP.NET同以前的ASP一樣,當
服務器上發生了一個運行時間或編譯時間錯誤時,就會生成一個html 錯誤頁面。但是與ASP不同,ASP.NET格外關注的是:要確保在默認狀態下,不會因為這個錯誤的發生而泄露“安全”信息。尤其是如果你從一個遠程機器上點擊服務器的話?!皁ut of the box”型的錯誤處理設置將不會導致顯示遠程機器的編譯器信息、泄露配置信息、文件名、堆棧記錄 、源代碼或線性數據。相反,遠程用戶只會看到一個如“發生了應用程序錯誤”的普通信息。要想查看錯誤細節,用戶必須要:1)從本地服務器再次點擊頁面,或者是 2)在機器或應用程序的config.web文件中修改配置的設置來允許遠程訪問: 〈configuration〉
〈customerrors mode="off" /〉
〈/configuration〉 我們希望通過將默認狀態設置成我們不得不“安全”的樣子,從而能夠最終幫助保護應用程序的完整性和安全性。并且由此糾正許多ASP開發人員—特別是ASP管理人員都在反映的一個共同的抱怨/擔心)。 使用定制錯誤頁面 雖然我們發送給用戶的公用錯誤信息是安全的,就是說它不會威脅到應用程序的秘密,但是這樣的信息并不好看。也許你希望用戶永遠也看不到這樣的信息。相反,當處理請求的過程中,如果發生了一個為處理的錯誤,你希望能夠顯示自己的“定制錯誤頁面”,顯示出自己的品牌以及特定的錯誤信息。 向ASP.NET 應用程序中增加定制錯誤信息非常容易。首先,編寫自己的 web頁面,它可以是任何類型的文件:.htm,.aspx,.asp,等等。然后在應用程序的config.web文件中修改配置信息,讓它指向這個文件。 舉例說明,以下這個配置信息說明在發生了任何未能預定處理錯誤的情況下,瀏覽器都應該被重定向到“ErrorPage.aspx”頁面: 〈configuration〉
〈customerrors mode="remoteonly" defaultredirect="ErrorPage.aspx" /〉
〈/configuration〉 〈customerrors〉標記中的“defaultredirect”屬性定義了在發生錯誤的情況下,用戶將被重定向到的“默認”頁面?;蛘?,也可以根據響應的http代碼狀態,重定向到其它的頁面來覆蓋這個默認值。例如:重定向到一個特殊的“未找到文件”錯誤頁面、“非法訪問”錯誤頁面、“服務器沖突”錯誤頁面等等。 舉例說明,以下的配置信息覆蓋3個特定的http 狀態代碼,所有其它錯誤都返回到一個默認頁面: 〈customerrors defaultredirect="http://anotherhost/error.aspx" mode="remoteonly"〉
〈error statuscode="500" redirect="http:/anotherhost/pages/callsupport.html" /〉
〈error statuscode="404" redirect="http:/anotherhost/pages/adminmessage.html" /〉
〈error statuscode="403" redirect="http:/anotherhost/pages/noa
clearcase/" target="_blank" >ccess.html" /〉
〈/customerrors〉 在定制錯誤頁面上有一件事我們已經遇到過,那就是雖然它們對于已經完成的情況非常有用,然而在開發過程中卻非常難以對付。因為你預想到在開發過程中會有
bug,并且當你發現的時候,真的希望看到實際的錯誤信息跟蹤。為了解決這個問題,〈customerrors〉標記支持一個有3個值的“mode”屬性: “on”:意思是總是發出定制錯誤頁面; “off”:意思是從不發出定制錯誤頁面(你總是看到原始的錯誤信息); “remoteonly”:意思是只有當遠程瀏覽器點擊站點時才發出定制錯誤頁面(而在實際機器上點擊站點的開發人員看到的是詳細的錯誤信息)。 裝備應用程序幫助管理員跟蹤錯誤 雖然向客戶顯示定制的錯誤信息是一件好事,但也許你還是希望,當一個錯誤在站點上發生時,開發人員和管理員能夠很容易地實時發現它,并且識別出是什么問題、url及例外信息是什么。 為了解決這個問題,ASP.NET引入了一個可以在Global.asax文件中處理的新的“應用程序層”事件:“Application_Error”。在處理一個web請求的過程中,當有一個未處理的例外發生時,這個方法就被調用。開發人員從中可以獲得有關請求的特殊信息,例如:要彈出頁面的url、查詢字符串變量、用戶代理、cookie的值等等,以及封裝錯誤信息的實際例外對象的信息。然后就可以繼續進行,運行任何他們想要跟蹤以及用來通知管理員和開發人員有關問題的邏輯,這可能包括使用 System.Diagnostic APIs向NET事件日志寫入信息、使用System.Web.Util SMTP Email APIs向管理員發email、向一個
數據庫中寫入信息等等。 舉例說明,以下的Global.asax文件演示了如何向一個定制NT事件日志“MyCustomLog”寫入錯誤信息,包括頁面url和例外堆棧記錄: 〈%@ Import Namespace="System.Diagnostics" %〉
〈script language="
VB" runat=server〉
Sub Application_Error(Sender As Object, E as EventArgs)
'Obtain the URL of the Request
Dim PageUrl as String = Request.Path
'Obtain the Exception Object for the Error
Dim ErrorInfo as Exception = Server.GetLastError()
'Construct Error Message to Write to NT Event Log
Dim Message As String = "Url " amp; PageUrl
Message = Message amp; " Error: "
Message = Message amp; ErrorInfo.ToString
'NT Event Log Name to Write Message To
Dim LogName As String = "MyCustomLog"
'Create Event Log if It Doesn’t Exist
If (Not EventLog.SourceExists(LogName)) Then
EventLog.CreateEventSource(LogName, LogName)
End if
'Fire off to Event Log
Dim Log as New EventLog
Log.Source = LogName
Log.WriteEntry(Message, EventLogEntryType.Error)
End Sub
〈/script〉 要想看到上門所描述的一切實際是如何工作的,試著在機器上創建一個新的IIS應用程序vroot,然后將上面的樣本代碼復制到一個新的“Global.asax”文件中,這個文件是在應用程序根目錄中創建的。然后,將以下代碼片段復制/粘貼到“Blowup.aspx”文件中: 〈html〉
〈body〉
〈%
Dim x
x.BlowUp()
%〉
〈/body〉
〈/html〉 注意,這個文件總是會引起一個運行時間錯誤,因為其中引起了一個無效引
用例外,而“x”對象根本就沒有創建,也沒有“Blowup”方法。因此,當你用瀏覽器點擊頁面,將看到一個錯誤信息時。 除了在瀏覽器內看到錯誤信息外,由于Global.asax內部存在Application_Error事件,你還會在NT 事件日志中看到它。要查看這點,請選擇“開始菜單-〉程序-〉管理工具-〉事件查看器”,然后點擊右側的“MyCustomLog”節點,就會顯示出日志的內容。在其內部特定項目上雙擊就可以看到頁面的url以及堆棧的記錄細節。 注意:NT事件日志可以遠程查看,因此這是一個從遠處跟蹤機器狀態的簡便方法。還要注意:當你動態創建一個新的NT事件日志時,為了看到它在列表中顯示出來,必須每次都退出并重新啟動NT事件查看器。 既然當新的ASP.NET 應用程序內部發生問題時,我們能夠輕松地跟蹤錯誤的細節,現在我們就要確保我們的客戶所看到的只是友好的定制錯誤信息。這就要在vroot中創建一個“CustomError.aspx”頁面: 〈html〉
〈body〉
〈h1〉 My Custom Error Page〈/h3〉
〈h3〉 Todo: Make this pretty.... 〈/h3〉
〈/body〉
〈/html〉 然后修改config.web文件,讓它指向這個頁面: 〈configuration〉
〈customerrors mode="on" defaultredirect="CustomError.aspx"/〉
〈/configuration〉 這時請再次點擊BlowUp.aspx頁面,你會看到瀏覽器被自動重定向到友好的錯誤頁面。如果你查看NT事件日志的話,會看到關于這個錯誤對一個管理員進行通知時必要的所有細節,以及開發人員要識別和修復它所必要的所有細節。 要注意,由于客戶信息信息被存儲在config.web 文件而不是IIS元數據中,因此它可以通過“xcopied”進行安裝,而不需要請求用戶使用IIS Admin 工具。ASP.NET的這種客戶定制功能在IIS4 和IIS5中也同樣奏效。
|
原文轉自:http://www.anti-gravitydesign.com