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


簡介

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>();
            });


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM