国产探花免费观看_亚洲丰满少妇自慰呻吟_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教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 城市| 黄浦区| 江口县| 安龙县| 咸阳市| 静宁县| 乐山市| 晋州市| 合作市| 怀安县| 舞钢市| 丹棱县| 昭通市| 宜都市| 潼南县| 喜德县| 理塘县| 武隆县| 万安县| 延边| 织金县| 锦州市| 淄博市| 永平县| 武义县| 民丰县| 古浪县| 田东县| 游戏| 夏河县| 武宣县| 浮梁县| 濮阳市| 赤城县| 台湾省| 兴文县| 陆良县| 县级市| 滁州市| 葫芦岛市| 桂林市|