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异常过滤器过滤器用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue 中使用watch监听$route
- 下一篇: C#一些实用的函数