asp.net core MVC 过滤器之ActionFilter过滤器(二)
簡介
Action過濾器將在controller的Action執(zhí)行之前和之后執(zhí)行相應(yīng)的方法。
實現(xiàn)一個自定義Action過濾器
自定義一個全局異常過濾器需要實現(xiàn)IActionFilter接口
public class ActionFilter : IActionFilter
{
? ? public void OnActionExecuted(ActionExecutedContext context)
? ? {
? ? ? ? Console.WriteLine("action執(zhí)行之后");
? ? }
? ? public void OnActionExecuting(ActionExecutingContext context)
? ? {
? ? ? ? Console.WriteLine("action執(zhí)行之前");
? ? }
}
IActionFilter需要實現(xiàn)兩個方法OnActionExecuted,OnActionExecuting。OnActionExecuting將在Action之前執(zhí)行,OnActionExecuted在Action之后執(zhí)行。
知道原理之后我們們就可以利用其特性來簡化我們的代碼,在MVC中一個重要的概念就時Model驗證,我們定義Model約束,然后在Action中驗證Model是否綁定成功,我們的Action中重復(fù)地寫如下代碼?
[HttpGet]public ActionResult Get() { ??if (!ModelState.IsValid)
return BadRequest("參數(shù)錯誤!");
}
?這樣重復(fù)的代碼不僅增加代碼復(fù)雜都也不美觀,我們可以在ActionFilter中自動完成
public void OnActionExecuting(ActionExecutingContext context)
{
? ? if (context.ModelState.IsValid) return;
? ? var modelState = context.ModelState.FirstOrDefault(f => f.Value.Errors.Any());
? ? string errorMsg = modelState.Value.Errors.First().ErrorMessage;
? ? throw new AppException(errorMsg);
}
當(dāng)Model綁定錯誤時,我們拋出異常信息,并在上一章節(jié)的異常過濾器ExceptionFilter中捕獲,返回錯誤信息給請求方。
我們也可以利用ActionFilter的特性來記錄Action的執(zhí)行時間,當(dāng)Action執(zhí)行時間過慢時輸出警告日志
?
public class ActionFilter : IActionFilter
{
? ? public void OnActionExecuted(ActionExecutedContext context)
? ? {
? ? ? ? var httpContext = context.HttpContext;
? ? ? ? var stopwach = httpContext.Items[Resources.StopwachKey] as Stopwatch;
? ? ? ? stopwach.Stop();
? ? ? ? var time = stopwach.Elapsed;
? ? ? ? if (time.TotalSeconds > 5)
? ? ? ? {
? ? ? ? ? ? var factory = context.HttpContext.RequestServices.GetService<ILoggerFactory>();
? ? ? ? ? ? var logger = factory.CreateLogger<ActionExecutedContext>();
? ? ? ? ? ? logger.LogWarning($"{context.ActionDescriptor.DisplayName}執(zhí)行耗時:{time.ToString()}");
? ? ? ? }
? ? }
? ? public void OnActionExecuting(ActionExecutingContext context)
? ? {
? ? ? ? var stopwach = new Stopwatch();
? ? ? ? stopwach.Start();
? ? ? ? context.HttpContext.Items.Add(Resources.StopwachKey, stopwach);
? ? }
}
上面的代碼利用使用HttpContext傳遞一個Stopwach來計算action的執(zhí)行時間,并在超過5秒時輸出警告日志。?
注冊全局過濾器
注冊方法與ExceptionFinter相同。找到系統(tǒng)根目錄Startup.cs文件,修改ConfigureServices方法如下
services.AddMvc(options =>{options.Filters.Add<ActionFilter>();});相關(guān)文章:?
.NET Core 2.0 正式發(fā)布信息匯總
.NET Standard 2.0 特性介紹和使用指南
.NET Core 2.0 的dll實時更新、https、依賴包變更問題及解決
.NET Core 2.0 特性介紹和使用指南
Entity Framework Core 2.0 新特性
體驗 PHP under .NET Core
.NET Core 2.0使用NLog
升級項目到.NET Core 2.0,在Linux上安裝Docker,并成功部署
解決Visual Studio For Mac Restore失敗的問題
ASP.NET Core 2.0 特性介紹和使用指南
.Net Core下通過Proxy 模式 使用 WCF
.NET Core 2.0 開源Office組件 NPOI
ASP.NET Core Razor頁面 vs MVC
Razor Page–Asp.Net Core 2.0新功能 ?Razor Page介紹
MySql 使用 EF Core 2.0 CodeFirst、DbFirst、數(shù)據(jù)庫遷移(Migration)介紹及示例
.NET Core 2.0遷移技巧之web.config配置文件
asp.net core MVC 過濾器之ExceptionFilter過濾器(一)
ASP.NET Core 使用Cookie驗證身份
原文地址:http://www.cnblogs.com/huanent/p/7421220.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的asp.net core MVC 过滤器之ActionFilter过滤器(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core 使用Cooki
- 下一篇: asp.net ajax控件工具集 Au