zoukankan      html  css  js  c++  java
  • 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>();
                });
  • 相关阅读:
    【更新】Java发送邮件:个人邮箱(QQ & 网易163)+企业邮箱+Android
    git pull 出现 WARNING: POSSIBLE DNS SPOOFING DETECTED!
    Redis解决“重试次数”场景的实现思路
    IDEA更改JavaScript版本
    npm与yarn命令
    SpringBoot+Vue前后端分离项目,maven package自动打包整合
    Vue(九)使用Ant Design入门——环境搭建
    Git常用命令
    Vue(八)全局变量和全局方法
    笔记本电池怎样使用问题
  • 原文地址:https://www.cnblogs.com/fei686868/p/10470494.html
Copyright © 2011-2022 走看看