日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC HandleError异常过滤器过滤器用法

發布時間:2023/12/10 asp.net 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC HandleError异常过滤器过滤器用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

異常過濾器是處理代碼異常的,在系統的代碼拋錯的時候執行,MVC默認已經實現了異常過濾器,并且注冊到了App_Start目錄下的FilterConfig.cs:

filters.Add(new HandleErrorAttribute());

異常過濾器生效于整個系統,任何接口或者頁面報錯都會執行MVC默認的異常處理,并返回一個默認的報錯頁面:Views/Shared/Error(程序發到服務器上報錯時才可以看到本頁面,本地調試權限高,還是可以看到具體報錯信息的)

@{

? ? Layout = null;

}

<!DOCTYPE html>

<html>

<head>

? ? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

? ? <meta name="viewport" content="width=device-width" />

? ? <title>錯誤</title>

</head>

<body>

? ? <hgroup>

? ? ? ? <h1>錯誤。</h1>

? ? ? ? <h2>處理你的請求時出錯。</h2>

? ? </hgroup>

</body>

</html>

默認的異常過濾器顯然無法滿足使用需求,重寫下異常過濾器,滿足項目實際開發中的需求:

1)報錯可以記錄錯誤代碼所在的控制器和方法,以及報錯時的請求參數和時間;

2)返回特定格式的JSON方便前端處理。因為現在系統大部分是ajax請求,報錯了返回MVC默認的報錯頁面,前端不好處理

新建一個類LogExceptionAttribute繼承HandleErrorAttribute,并重寫內部的OnException方法:

public override void OnException(ExceptionContext filterContext)

?{

? ? ?if (!filterContext.ExceptionHandled)

? ? ?{

? ? ? ? ?string controllerName = (string)filterContext.RouteData.Values["controller"];

? ? ? ? ?string actionName = (string)filterContext.RouteData.Values["action"];

? ? ? ? ?string param = Common.GetPostParas();

? ? ? ? ?string ip = HttpContext.Current.Request.UserHostAddress;

? ? ? ? ?LogManager.GetLogger("LogExceptionAttribute").Error("Location:{0}/{1} Param:{2}UserIP:{3} Exception:{4}", controllerName, actionName, param, ip, filterContext.Exception.Message);


? ? ? ? ?filterContext.Result = new JsonResult

? ? ? ? ?{

? ? ? ? ? ? ?Data = new ReturnModel_Common { success = false, code = ReturnCode_Interface.服務端拋錯, msg = filterContext.Exception.Message },

? ? ? ? ? ? ?JsonRequestBehavior = JsonRequestBehavior.AllowGet

? ? ? ? ?};

? ? ?}

? ? ?if (filterContext.Result is JsonResult)

? ? ? ? ?filterContext.ExceptionHandled = true;//返回結果是JsonResult,則設置異常已處理

? ? ?else

? ? ? ? ?base.OnException(filterContext);//執行基類HandleErrorAttribute的邏輯,轉向錯誤頁面

?}

異常過濾器就不像授權過濾器一樣標注在方法上面了,直接到App_Start目錄下的FilterConfig.cs注冊下,這樣所有的接口都可以生效了:

filters.Add(new LogExceptionAttribute());

異常過濾器里使用了NLog作為日志記錄工具,Nuget安裝命令:

Install-Package NLog?

Install-Package NLog.Config


相比Log4net,NLog配置簡單,僅幾行代碼即可,NLog.config:

<?xml version="1.0" encoding="utf-8" ?>

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

? <targets>

? ? <target xsi:type="File" name="f" fileName="${basedir}/log/${shortdate}.log" layout="${uppercase:${level}} ${longdate} ${message}" />

? ? <target xsi:type="File" name="f2" fileName="D:\log\MVCExtension\${shortdate}.log" layout="${uppercase:${level}} ${longdate} ${message}" />

? </targets>

? <rules>

? ? <logger name="*" minlevel="Debug" writeTo="f2" />

? </rules>

</nlog>

如果報錯,日志就記錄在D盤的log目錄下的MVCExtension目錄下,一個項目一個日志目錄,方便管理。全部配置完成,看下代碼:

public JsonResult HandleErrorFilterTest()

?{?

? ?int i = int.Parse("abc"); ??

? ?return Json(new ReturnModel_Data { data = i });?

}

字符串強轉成int類型,必然報錯,頁面響應:

同時日志也記錄下來了:




總結

以上是生活随笔為你收集整理的ASP.NET MVC HandleError异常过滤器过滤器用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。