国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

asp.net core MVC 過濾器之ActionFilter過濾器(2)

2024-07-10 12:49:01
字體:
來源:轉載
供稿:網友

本系類將會講解asp.net core MVC中的內置過濾器的使用,將分為以下章節

  asp.net core MVC 過濾器之ExceptionFilter過濾器(一)

  asp.net core MVC 過濾器之ActionFilter過濾器(二)

  asp.net core MVC 過濾器之ResultFilter過濾器(三)

  asp.net core MVC 過濾器之ResourceFilter過濾器(四)

  asp.net core MVC 過濾器之AuthorizationFilter過濾器(五)

簡介

Action過濾器將在controller的Action執行之前和之后執行相應的方法。

實現一個自定義Action過濾器

自定義一個全局異常過濾器需要實現IActionFilter接口

public class ActionFilter : IActionFilter{  public void OnActionExecuted(ActionExecutedContext context)  {    Console.WriteLine("action執行之后");  }  public void OnActionExecuting(ActionExecutingContext context)  {    Console.WriteLine("action執行之前");  }}

IActionFilter需要實現兩個方法OnActionExecuted,OnActionExecuting。OnActionExecuting將在Action之前執行,OnActionExecuted在Action之后執行。

知道原理之后我們們就可以利用其特性來簡化我們的代碼,在MVC中一個重要的概念就時Model驗證,我們定義Model約束,然后在Action中驗證Model是否綁定成功,我們的Action中重復地寫如下代碼

[HttpGet]public ActionResult Get(){  if (!ModelState.IsValid) return BadRequest("參數錯誤!");}

這樣重復的代碼不僅增加代碼復雜都也不美觀,我們可以在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);}

當Model綁定錯誤時,我們拋出異常信息,并在上一章節的異常過濾器ExceptionFilter中捕獲,返回錯誤信息給請求方。

我們也可以利用ActionFilter的特性來記錄Action的執行時間,當Action執行時間過慢時輸出警告日志

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}執行耗時:{time.ToString()}");    }  }  public void OnActionExecuting(ActionExecutingContext context)  {    var stopwach = new Stopwatch();    stopwach.Start();    context.HttpContext.Items.Add(Resources.StopwachKey, stopwach);  }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 天峨县| 江华| 井研县| 六枝特区| 湘潭县| 利川市| 仁化县| 翼城县| 桂东县| 札达县| 手机| 香港 | 鄢陵县| 普定县| 郁南县| 都江堰市| 祁门县| 浙江省| 南江县| 安图县| 临漳县| 清丰县| 从化市| 景谷| 芜湖市| 松溪县| 枣阳市| 柳州市| 云安县| 安乡县| 永平县| 平昌县| 微山县| 嵊州市| 湖口县| 海伦市| 江源县| 博罗县| 纳雍县| 东兰县| 延津县|