国产99福利精品视频|杨幂精品国产福利在线|国精品午夜福利视频不卡|欧美精品黄网站在线播放|精品国产乱码久久久久久久|国产大片中文字幕在线观看|国产肥熟女视频一区二区三区|国产乱码无码视频一区二区三区

ASP.NET MVC中的統(tǒng)一化自定義異常處

來源:長沙北大青鳥大計校區(qū)|發(fā)布時間:2015-07-19 09:39:06

 

當ASP.NET MVC程序出現(xiàn)了異常,怎么處理更加規(guī)范?

1. 最簡單的方法是設置<customErrors/>節(jié)點

<customErrors>節(jié)點用于定義一些自定義錯誤信息的信息。此節(jié)點有Mode和defaultRedirect兩個屬性,其中defaultRedirect屬性是一個可選屬性,表示應用程序發(fā)生錯誤時重定向到的默認URL,如果沒有指定該屬性則顯示一般性錯誤。Mode屬性是一個必選屬性,它有三個可能值,它們所代表的意義分別如下: On 表示在本地和遠程用戶都會看到自定義錯誤信息。 Off 禁用自定義錯誤信息,本地和遠程用戶都會看到詳細的錯誤信息。 RemoteOnly 表示本地用戶將看到詳細錯誤信息,而遠程用戶將會看到自定義錯誤信息。

這里有必要說明一下本地用戶和遠程用戶的概念。當我們訪問asp.net應用程時所使用的機器和發(fā)布asp.net應用程序所使用的機器為同一臺機器時成為本地用戶,反之則稱之為遠程用戶。在開發(fā)調試階段為了便于查找錯誤Mode屬性建議設置為Off,而在部署階段應將Mode屬性設置為On或者 RemoteOnly,以避免這些詳細的錯誤信息暴露了程序代碼細節(jié)從而引來黑客的入侵。

<error>子節(jié)點

在<customErrors>節(jié)點下還包含有<error>子節(jié)點,這個節(jié)點主要是根據(jù)服務器的HTTP錯誤狀態(tài)代碼而重定向到我們自定義的錯誤頁面,注意要使<error>子節(jié)點下的配置生效,必須將<customErrors>節(jié)點的Mode屬性設置為“On”。下面是一個例子:

<customErrors mode="On" defaultRedirect="GenericErrorPage.htm">   

     <error statusCode="403" redirect="403.htm" />   

     <error statusCode="404" redirect="404.htm" />   

</customErrors>  

在上面的配置中如果用戶訪問的頁面不存在就會跳轉到404.htm頁面,如果用戶沒有權限訪問請求的頁面則會跳轉到403.htm頁面,403.htm和404.htm頁面都是我們自己添加的頁面,我們可以在頁面中給出友好的錯誤提示。

2. 使用過濾器HandleErrorAttribute

隨著ASP.NET MVC版本的更新,出現(xiàn)了HandleErrorAttribute,使用Filter以AOP的思想實現(xiàn)了針對于Action的異常處理。使用此 Filter后,當程序中出現(xiàn)異常的時候,會去封裝這些異常信息,然后路由自動轉到該Controller對應的Error.cshtml中,如果此路徑下沒有改文件,則會到shared目錄中尋找此文件。另外一個相關的是在Global.asax中的protected void Application_Error[object sender, EventArgs e]方法,是捕捉異常的最后一道防線,也就是說,這是最高層次的異常捕獲處理邏輯。使用HandleErrorAttribute后,找到了Error.cshtml,則此時異常已經(jīng)被捕獲處理,所以不會再次被 Application_Error捕獲處理。此外,可以通過@model HandleErrorInfo 在Error.cshtml中定制顯示異常信息。有一點需要注意的是,HandleErrorAttribute是在customErrors基礎之上的,如果想使用 HandleErrorAttribute,customErrors的Mode必須要設置為On或RemoteOnly. 否則,HandleErrorAttribute將不起作用。

3. 自定義顯示路徑

如果遇到異常后不單單是要自定義異常顯示,而且還需要進行日志記錄。此時,可以通過繼承擴展HandleErrorAttribute來實現(xiàn)新的 Filter,然后在lobal.ascx中對所有的Action進行注冊,filters.Add(new MyHandleErrorAttribute()).在這里詳細說明一下另一種方式。我們可以寫一個專門的Controller和Action來進行異常發(fā)生時的路由設置.

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(); 

        

}

當出現(xiàn)異常的時候,把異常拋到最頂端,由Application_Error統(tǒng)一處理。這里的統(tǒng)一處理就包括,記錄日志,重新進行頁面定向等。

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ū)分兩種錯誤 

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

            

        

    }

上一篇:ASP 五大高效提速技巧
下一篇:概述ASP.NET Membership

熱門話題

招生熱線: 4008-0731-86 / 0731-82186801

學校地址: 長沙市天心區(qū)團結路6號

Copyright © 2006 | 湖南大計信息科技有限公司 版權所有

湘ICP備14017520號-3

關注我們
在線咨詢
嘿,我來幫您!