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