ASP.NET中的錯誤處理支援

來源:互聯網
上載者:User
asp.net|錯誤|錯誤處理 ASP.NET具有一個很好的新功能:它對已耗用時間錯誤的處理和跟蹤提供了豐富支援。特別是,它為管理員提供了一種很簡單的方法,可以保證那些令人恐懼的“ASP 43433ax”十六進位形式的錯誤永遠也不會被顯示到客戶面前。相反,它允許顯示一個較為定製化的資訊,比如“對不起,這個網站不可用”。ASP.NET還提供了一種強大的方法,使開發人員可以對他們的代碼進行裝備,向管理員提供發生在工作網站問題的額外資訊與通知。本文詳細介紹了這兩種技術,同時在結尾包括了一個樣本代碼,你可以直接使用它實驗一下。

確保不會泄露安全資訊

ASP.NET同以前的ASP一樣,當伺服器上發生了一個已耗用時間或編譯時間錯誤時,就會產生一個html 錯誤頁面。但是與ASP不同,ASP.NET格外關注的是:要確保在預設狀態下,不會因為這個錯誤的發生而泄露“安全”資訊。尤其是如果你從一個遠程機器上點擊伺服器的話。“out 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/noaccess.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 " & PageUrl
Message = Message & " Error: "
Message = Message & 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中也同樣奏效。
(轉)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.