ASP.NET中的錯誤處理支援

來源:互聯網
上載者:User
ASP.NET中的錯誤處理支援 向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 RequestDim PageUrl as String = Request.Path'Obtain the Exception Object for the ErrorDim ErrorInfo as Exception = Server.GetLastError()'Construct Error Message to Write to NT Event LogDim Message As String = "Url " & PageUrlMessage = Message & " Error: "Message = Message & ErrorInfo.ToString'NT Event Log Name to Write Message ToDim LogName As String = "MyCustomLog"'Create Event Log if It Doesn’t ExistIf (Not EventLog.SourceExists(LogName)) ThenEventLog.CreateEventSource(LogName, LogName)End if'Fire off to Event LogDim Log as New EventLogLog.Source = LogNameLog.WriteEntry(Message, EventLogEntryType.Error)End Sub</script> 要想看到上門所描述的一切實際是如何工作的,試著在機器上建立一個新的IIS應用程式vroot,然後將上面的樣本代碼複製到一個新的“Global.asax”檔案中,這個檔案是在應用程式根目錄中建立的。然後,將以下程式碼片段複製/粘貼到“Blowup.aspx”檔案中: <html><body><%Dim xx.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.