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

首頁 > 編程 > .NET > 正文

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

2024-07-10 13:32:38
字體:
來源:轉載
供稿:網友

本系類將會講解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);  }}

上面的代碼利用使用HttpContext傳遞一個Stopwach來計算action的執行時間,并在超過5秒時輸出警告日志。 

注冊全局過濾器

注冊方法與ExceptionFinter相同。找到系統根目錄Startup.cs文件,修改ConfigureServices方法如下

services.AddMvc(options =>      {        options.Filters.Add<ActionFilter>();      });

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到ASP.NET教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 邹城市| 铜鼓县| 奉化市| 平利县| 东阳市| 达尔| 蚌埠市| 巴林右旗| 磐安县| 高陵县| 遂溪县| 元谋县| 宜川县| 晋州市| 宁晋县| 桦南县| 汉川市| 湖北省| 怀柔区| 泽库县| 三门峡市| 仙游县| 遂溪县| 永昌县| 霍州市| 石景山区| 高要市| 兴宁市| 平武县| 内江市| 新宁县| 广南县| 虞城县| 潮州市| 宾川县| 南汇区| 雅江县| 疏勒县| 建德市| 钟祥市| 钟祥市|