您的位置:首頁 > 教學(xué)課堂 > .NET技術(shù)
來源:長(zhǎng)沙北大青鳥大計(jì)校區(qū)|發(fā)布時(shí)間:2015-07-19 09:39:06
當(dāng)ASP.NET MVC程序出現(xiàn)了異常,怎么處理更加規(guī)范?
1. 最簡(jiǎn)單的方法是設(shè)置<customErrors/>節(jié)點(diǎn)
<customErrors>節(jié)點(diǎn)用于定義一些自定義錯(cuò)誤信息的信息。此節(jié)點(diǎn)有Mode和defaultRedirect兩個(gè)屬性,其中defaultRedirect屬性是一個(gè)可選屬性,表示應(yīng)用程序發(fā)生錯(cuò)誤時(shí)重定向到的默認(rèn)URL,如果沒有指定該屬性則顯示一般性錯(cuò)誤。Mode屬性是一個(gè)必選屬性,它有三個(gè)可能值,它們所代表的意義分別如下: On 表示在本地和遠(yuǎn)程用戶都會(huì)看到自定義錯(cuò)誤信息。 Off 禁用自定義錯(cuò)誤信息,本地和遠(yuǎn)程用戶都會(huì)看到詳細(xì)的錯(cuò)誤信息。 RemoteOnly 表示本地用戶將看到詳細(xì)錯(cuò)誤信息,而遠(yuǎn)程用戶將會(huì)看到自定義錯(cuò)誤信息。
這里有必要說明一下本地用戶和遠(yuǎn)程用戶的概念。當(dāng)我們?cè)L問asp.net應(yīng)用程時(shí)所使用的機(jī)器和發(fā)布asp.net應(yīng)用程序所使用的機(jī)器為同一臺(tái)機(jī)器時(shí)成為本地用戶,反之則稱之為遠(yuǎn)程用戶。在開發(fā)調(diào)試階段為了便于查找錯(cuò)誤Mode屬性建議設(shè)置為Off,而在部署階段應(yīng)將Mode屬性設(shè)置為On或者 RemoteOnly,以避免這些詳細(xì)的錯(cuò)誤信息暴露了程序代碼細(xì)節(jié)從而引來黑客的入侵。
<error>子節(jié)點(diǎn)
在<customErrors>節(jié)點(diǎn)下還包含有<error>子節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)主要是根據(jù)服務(wù)器的HTTP錯(cuò)誤狀態(tài)代碼而重定向到我們自定義的錯(cuò)誤頁面,注意要使<error>子節(jié)點(diǎn)下的配置生效,必須將<customErrors>節(jié)點(diǎn)的Mode屬性設(shè)置為“On”。下面是一個(gè)例子:
<customErrors mode="On" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="403.htm" />
<error statusCode="404" redirect="404.htm" />
</customErrors>
在上面的配置中如果用戶訪問的頁面不存在就會(huì)跳轉(zhuǎn)到404.htm頁面,如果用戶沒有權(quán)限訪問請(qǐng)求的頁面則會(huì)跳轉(zhuǎn)到403.htm頁面,403.htm和404.htm頁面都是我們自己添加的頁面,我們可以在頁面中給出友好的錯(cuò)誤提示。
2. 使用過濾器HandleErrorAttribute
隨著ASP.NET MVC版本的更新,出現(xiàn)了HandleErrorAttribute,使用Filter以AOP的思想實(shí)現(xiàn)了針對(duì)于Action的異常處理。使用此 Filter后,當(dāng)程序中出現(xiàn)異常的時(shí)候,會(huì)去封裝這些異常信息,然后路由自動(dòng)轉(zhuǎn)到該Controller對(duì)應(yīng)的Error.cshtml中,如果此路徑下沒有改文件,則會(huì)到shared目錄中尋找此文件。另外一個(gè)相關(guān)的是在Global.asax中的protected void Application_Error[object sender, EventArgs e]方法,是捕捉異常的最后一道防線,也就是說,這是最高層次的異常捕獲處理邏輯。使用HandleErrorAttribute后,找到了Error.cshtml,則此時(shí)異常已經(jīng)被捕獲處理,所以不會(huì)再次被 Application_Error捕獲處理。此外,可以通過@model HandleErrorInfo 在Error.cshtml中定制顯示異常信息。有一點(diǎn)需要注意的是,HandleErrorAttribute是在customErrors基礎(chǔ)之上的,如果想使用 HandleErrorAttribute,customErrors的Mode必須要設(shè)置為On或RemoteOnly. 否則,HandleErrorAttribute將不起作用。
3. 自定義顯示路徑
如果遇到異常后不單單是要自定義異常顯示,而且還需要進(jìn)行日志記錄。此時(shí),可以通過繼承擴(kuò)展HandleErrorAttribute來實(shí)現(xiàn)新的 Filter,然后在lobal.ascx中對(duì)所有的Action進(jìn)行注冊(cè),filters.Add(new MyHandleErrorAttribute()).在這里詳細(xì)說明一下另一種方式。我們可以寫一個(gè)專門的Controller和Action來進(jìn)行異常發(fā)生時(shí)的路由設(shè)置.
1 2 3 4 5 6 7 8 9 10 11 12 |
public class UtilityController : Controller { public ActionResult Error() { return View(); } public ActionResult PageNotFound() { return View(); } } |
當(dāng)出現(xiàn)異常的時(shí)候,把異常拋到最頂端,由Application_Error統(tǒng)一處理。這里的統(tǒng)一處理就包括,記錄日志,重新進(jìn)行頁面定向等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
protected void Application_Error(object sender, EventArgs e) { var ex = Server.GetLastError(); Log.Error(ex); //記錄日志信息 var httpStatusCode = (ex is HttpException) ? (ex as HttpException).GetHttpCode() : 500; //這里僅僅區(qū)分兩種錯(cuò)誤 var httpContext = ((MvcApplication)sender).Context; httpContext.ClearError(); httpContext.Response.Clear(); httpContext.Response.StatusCode = httpStatusCode; var shouldHandleException = true; HandleErrorInfo errorModel; var routeData = new RouteData(); routeData.Values["controller"] = "Utility"; switch (httpStatusCode) { case 404: routeData.Values["action"] = "PageNotFound"; errorModel = new HandleErrorInfo(new Exception(string.Format("No page Found", httpContext.Request.UrlReferrer), ex), "Utility", "PageNotFound"); break; default: routeData.Values["action"] = "Error"; Exception exceptionToReplace = null; //這里使用了EntLib的異常處理模塊的一些功能 shouldHandleException = ExceptionPolicy.HandleException(ex, "LogAndReplace", out exceptionToReplace); errorModel = new HandleErrorInfo(exceptionToReplace, "Utility", "Error"); break; } if (shouldHandleException) { var controller = new UtilityController(); controller.ViewData.Model = errorModel; //通過代碼路由到指定的路徑 ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData)); } } } |
全程面授,不高薪都難
申請(qǐng)成功后,我們將在24小時(shí)內(nèi)與您聯(lián)系
招生熱線: 4008-0731-86 / 0731-82186801
學(xué)校地址: 長(zhǎng)沙市天心區(qū)團(tuán)結(jié)路6號(hào)
Copyright © 2006 | 湖南大計(jì)信息科技有限公司 版權(quán)所有
湘ICP備14017520號(hào)-3