.net5 实现 IActionFilter 实现自定义过滤器

一  通过实现 IActionFilter 实现自定义过滤器

1 自定义过滤器对应的特性

    public class ImpIActionFilterDescAttribute : Attribute
    {
        public string Code { get; set; }
        public string Desc { get; set; }
        public ImpIActionFilterDescAttribute(string code,string desc)
        {
            Code = code;
            Desc = desc;
        }
    }

 

2 自定义过滤器

    /// <summary>
    /// 实现 IActionFilter 接口的过滤器
    /// </summary>
    public class ImpIActionFilter : IActionFilter
    {
        // 在方法执行完后调用的逻辑
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // 获取controller
            var controller = context.Controller;

            #region 判断 controller 上是否有该拦截特性
            var impIActionFilterDescAttribut_controller = controller.GetType().GetCustomAttribute<ImpIActionFilterDescAttribute>();
            if (impIActionFilterDescAttribut_controller != null && impIActionFilterDescAttribut_controller.Code.Length > 2)
            {
                // 将Result设置为非空值使过滤器管道短路,会阻止管道的其余部分执行
                context.Result = new JsonResult("[controller]无权访问...");
                return;
            }
            #endregion

            #region 如果 controller 无该拦截特性再判断该 action 是否有该拦截特性
            if (context.ActionDescriptor.RouteValues.ContainsKey("action"))
            {
                // 获取当前action名
                var actionName = context.ActionDescriptor.RouteValues["action"];
                var impIActionFilterDescAttribute_action = controller.GetType().GetMethod(actionName).GetCustomAttribute<ImpIActionFilterDescAttribute>();
                if(impIActionFilterDescAttribute_action != null && impIActionFilterDescAttribute_action.Code.Length>2)
                {
                    // 将Result设置为非空值使过滤器管道短路,会阻止管道的其余部分执行
                    context.Result = new JsonResult("[action]无权访问...");
                }
            }
            #endregion
        }

        // 在方法执行前调用的逻辑
        public void OnActionExecuting(ActionExecutingContext context)
        {
            Console.WriteLine("在方法执行前调用的逻辑");
        }
    }

3 在 Startup.cs 注册过滤器,这里用之前写的 MyActionFilter 做实例,ImpIActionFilter 注册方式类似,这样所有的请求都会被该过滤器处理

mvc 项目注册自定义的过滤器

web api 项目注册自定义的过滤器

4 在 controller 中使用自定义的过滤器

 在 controller上标记,这样该 controller 下的所有 action都会被过滤器处理

    [ApiController]
    [Route("[controller]/[action]")]
    [ImpIActionFilterDesc("C001", "被拦截")]
    public class ImpIActionFilterController2 : ControllerBase
    {
        [HttpGet]
        public IActionResult Test1()
        {
            return new JsonResult("执行完成");
        }

        [HttpGet]
        public IActionResult Test2()
        {
            return new JsonResult("执行完成");
        }
    }

只在 action 上标记该拦截特性,这样只有标记了该特性的action与该拦截器想结婚

    [ApiController]
    [Route("[controller]/[action]")]
    public class ImpIActionFilterController : ControllerBase
    {
        [HttpGet]
        [ImpIActionFilterDesc("C001", "被拦截")]
        public IActionResult WillBeFilter()
        {
            return new JsonResult("执行完成");
        }

        [HttpGet]
        public IActionResult WillNotBeFilter()
        {
            return new JsonResult("执行完成");
        }
    }

 

 

 

参考链接

https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-6.0

posted @ 2021-08-23 17:08  温故纳新  阅读(343)  评论(0)    收藏  举报