国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

ASP.NET中的錯誤處理支持(轉(zhuǎn))

2024-07-10 13:07:35
字體:
供稿:網(wǎng)友
asp.net中的錯誤處理支持

asp.net具有一個很好的新功能:它對運(yùn)行時間錯誤的處理和跟蹤提供了豐富支持。特別是,它為管理人員提供了一種很簡單的方法,可以保證那些令人恐懼的“asp 43433ax”十六進(jìn)制形式的錯誤永遠(yuǎn)也不會被顯示到客戶面前。相反,它允許顯示一個較為定制化的信息,比如“對不起,這個站點(diǎn)不可用”。asp.net還提供了一種強(qiáng)大的方法,使開發(fā)人員可以對他們的代碼進(jìn)行裝備,向管理人員提供發(fā)生在工作站點(diǎn)問題的額外信息與通知。本文詳細(xì)介紹了這兩種技術(shù),同時在結(jié)尾包括了一個樣本代碼,你可以直接使用它試驗(yàn)一下。

確保不會泄露安全信息

asp.net同以前的asp一樣,當(dāng)服務(wù)器上發(fā)生了一個運(yùn)行時間或編譯時間錯誤時,就會生成一個html 錯誤頁面。但是與asp不同,asp.net格外關(guān)注的是:要確保在默認(rèn)狀態(tài)下,不會因?yàn)檫@個錯誤的發(fā)生而泄露“安全”信息。尤其是如果你從一個遠(yuǎn)程機(jī)器上點(diǎn)擊服務(wù)器的話?!皁ut of the box”型的錯誤處理設(shè)置將不會導(dǎo)致顯示遠(yuǎn)程機(jī)器的編譯器信息、泄露配置信息、文件名、堆棧記錄 、源代碼或線性數(shù)據(jù)。相反,遠(yuǎn)程用戶只會看到一個如“發(fā)生了應(yīng)用程序錯誤”的普通信息。要想查看錯誤細(xì)節(jié),用戶必須要:1)從本地服務(wù)器再次點(diǎn)擊頁面,或者是 2)在機(jī)器或應(yīng)用程序的config.web文件中修改配置的設(shè)置來允許遠(yuǎn)程訪問:

<configuration>
<customerrors mode="off" />
</configuration>

我們希望通過將默認(rèn)狀態(tài)設(shè)置成我們不得不“安全”的樣子,從而能夠最終幫助保護(hù)應(yīng)用程序的完整性和安全性。并且由此糾正許多asp開發(fā)人員—特別是asp管理人員都在反映的一個共同的抱怨/擔(dān)心)。

使用定制錯誤頁面

雖然我們發(fā)送給用戶的公用錯誤信息是安全的,就是說它不會威脅到應(yīng)用程序的秘密,但是這樣的信息并不好看。也許你希望用戶永遠(yuǎn)也看不到這樣的信息。相反,當(dāng)處理請求的過程中,如果發(fā)生了一個為處理的錯誤,你希望能夠顯示自己的“定制錯誤頁面”,顯示出自己的品牌以及特定的錯誤信息。

向asp.net 應(yīng)用程序中增加定制錯誤信息非常容易。首先,編寫自己的 web頁面,它可以是任何類型的文件:.htm,.aspx,.asp,等等。然后在應(yīng)用程序的config.web文件中修改配置信息,讓它指向這個文件。

舉例說明,以下這個配置信息說明在發(fā)生了任何未能預(yù)定處理錯誤的情況下,瀏覽器都應(yīng)該被重定向到“errorpage.aspx”頁面:

<configuration>
<customerrors mode="remoteonly" defaultredirect="errorpage.aspx" />
</configuration>

<customerrors>標(biāo)記中的“defaultredirect”屬性定義了在發(fā)生錯誤的情況下,用戶將被重定向到的“默認(rèn)”頁面?;蛘?,也可以根據(jù)響應(yīng)的http代碼狀態(tài),重定向到其它的頁面來覆蓋這個默認(rèn)值。例如:重定向到一個特殊的“未找到文件”錯誤頁面、“非法訪問”錯誤頁面、“服務(wù)器沖突”錯誤頁面等等。

舉例說明,以下的配置信息覆蓋3個特定的http 狀態(tài)代碼,所有其它錯誤都返回到一個默認(rèn)頁面:

<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>

在定制錯誤頁面上有一件事我們已經(jīng)遇到過,那就是雖然它們對于已經(jīng)完成的情況非常有用,然而在開發(fā)過程中卻非常難以對付。因?yàn)槟泐A(yù)想到在開發(fā)過程中會有bug,并且當(dāng)你發(fā)現(xiàn)的時候,真的希望看到實(shí)際的錯誤信息跟蹤。為了解決這個問題,<customerrors>標(biāo)記支持一個有3個值的“mode”屬性:

“on”:意思是總是發(fā)出定制錯誤頁面;

“off”:意思是從不發(fā)出定制錯誤頁面(你總是看到原始的錯誤信息);

“remoteonly”:意思是只有當(dāng)遠(yuǎn)程瀏覽器點(diǎn)擊站點(diǎn)時才發(fā)出定制錯誤頁面(而在實(shí)際機(jī)器上點(diǎn)擊站點(diǎn)的開發(fā)人員看到的是詳細(xì)的錯誤信息)。

裝備應(yīng)用程序幫助管理員跟蹤錯誤

雖然向客戶顯示定制的錯誤信息是一件好事,但也許你還是希望,當(dāng)一個錯誤在站點(diǎn)上發(fā)生時,開發(fā)人員和管理員能夠很容易地實(shí)時發(fā)現(xiàn)它,并且識別出是什么問題、url及例外信息是什么。

為了解決這個問題,asp.net引入了一個可以在global.asax文件中處理的新的“應(yīng)用程序?qū)印笔录骸癮pplication_error”。在處理一個web請求的過程中,當(dāng)有一個未處理的例外發(fā)生時,這個方法就被調(diào)用。開發(fā)人員從中可以獲得有關(guān)請求的特殊信息,例如:要彈出頁面的url、查詢字符串變量、用戶代理、cookie的值等等,以及封裝錯誤信息的實(shí)際例外對象的信息。然后就可以繼續(xù)進(jìn)行,運(yùn)行任何他們想要跟蹤以及用來通知管理員和開發(fā)人員有關(guān)問題的邏輯,這可能包括使用 system.diagnostic apis向net事件日志寫入信息、使用system.web.util smtp email apis向管理員發(fā)email、向一個數(shù)據(jù)庫中寫入信息等等。

舉例說明,以下的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>

要想看到上門所描述的一切實(shí)際是如何工作的,試著在機(jī)器上創(chuàng)建一個新的iis應(yīng)用程序vroot,然后將上面的樣本代碼復(fù)制到一個新的“global.asax”文件中,這個文件是在應(yīng)用程序根目錄中創(chuàng)建的。然后,將以下代碼片段復(fù)制/粘貼到“blowup.aspx”文件中:

<html>
<body>
<%
dim x
x.blowup()
%>
</body>
</html>

注意,這個文件總是會引起一個運(yùn)行時間錯誤,因?yàn)槠渲幸鹆艘粋€無效引用例外,而“x”對象根本就沒有創(chuàng)建,也沒有“blowup”方法。因此,當(dāng)你用瀏覽器點(diǎn)擊頁面,將看到一個錯誤信息時。

除了在瀏覽器內(nèi)看到錯誤信息外,由于global.asax內(nèi)部存在application_error事件,你還會在nt 事件日志中看到它。要查看這點(diǎn),請選擇“開始菜單->程序->管理工具->事件查看器”,然后點(diǎn)擊右側(cè)的“mycustomlog”節(jié)點(diǎn),就會顯示出日志的內(nèi)容。在其內(nèi)部特定項目上雙擊就可以看到頁面的url以及堆棧的記錄細(xì)節(jié)。

注意:nt事件日志可以遠(yuǎn)程查看,因此這是一個從遠(yuǎn)處跟蹤機(jī)器狀態(tài)的簡便方法。還要注意:當(dāng)你動態(tài)創(chuàng)建一個新的nt事件日志時,為了看到它在列表中顯示出來,必須每次都退出并重新啟動nt事件查看器。

既然當(dāng)新的asp.net 應(yīng)用程序內(nèi)部發(fā)生問題時,我們能夠輕松地跟蹤錯誤的細(xì)節(jié),現(xiàn)在我們就要確保我們的客戶所看到的只是友好的定制錯誤信息。這就要在vroot中創(chuàng)建一個“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>

這時請再次點(diǎn)擊blowup.aspx頁面,你會看到瀏覽器被自動重定向到友好的錯誤頁面。如果你查看nt事件日志的話,會看到關(guān)于這個錯誤對一個管理員進(jìn)行通知時必要的所有細(xì)節(jié),以及開發(fā)人員要識別和修復(fù)它所必要的所有細(xì)節(jié)。

要注意,由于客戶信息信息被存儲在config.web 文件而不是iis元數(shù)據(jù)中,因此它可以通過“xcopied”進(jìn)行安裝,而不需要請求用戶使用iis admin 工具。asp.net的這種客戶定制功能在iis4 和iis5中也同樣奏效。

最大的網(wǎng)站源碼資源下載站,

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 方城县| 宁乡县| 东乌珠穆沁旗| 山东| 海口市| 贵州省| 东乡县| 苏尼特右旗| 满洲里市| 昭觉县| 永靖县| 新沂市| 新津县| 简阳市| 大竹县| 城口县| 启东市| 四平市| 财经| 雷山县| 富裕县| 阳高县| 从江县| 吉林市| 留坝县| 南昌县| 莫力| 谢通门县| 公安县| 绵阳市| 墨竹工卡县| 晋江市| 金昌市| 周至县| 石屏县| 天门市| 弋阳县| 清镇市| 金山区| 盐亭县| 南涧|