.NetCoreAop之IActionFilter

博客 分享
0 189
张三
张三 2022-02-21 22:55:39
悬赏:0 积分 收藏

.Net Core Aop之IActionFilter

一、简介

在.net core 中Filter分为以下六大类:

1、AuthorizeAttribute(权限验证)

2、IResourceFilter(资源缓存)

3、IActionFilter(执行方法前后的记录)

4、IResultFilter(结果生成前后扩展)

5、IAlwaysRun(响应结果的补充)

6、IExceptionFilter(异常处理)

 二、IActionFilter(同步)

1、定义Filter

public class CustomerActionFilterAttribute : Attribute, IActionFilter    {        /// <summary>        /// 在XXAction执行之前        /// </summary>        /// <param name="context"></param>        public void OnActionExecuting(ActionExecutingContext context)        {            Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuting");        }        /// <summary>        /// 在XXAction执行之后        /// </summary>        /// <param name="context"></param>        public void OnActionExecuted(ActionExecutedContext context)        {            Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuted");        }            }

 

2、使用Filter

public class Home1Controller : Controller    {        private readonly ILogger<HomeController> _logger;        public Home1Controller(ILogger<HomeController> logger)        {            _logger = logger;            Console.WriteLine($"执行 {this.GetType().Name} 构造函数");        }        [CustomerActionFilter]        public IActionResult Index()        {            Console.WriteLine($"执行 Index 方法");            return View();        }    }

 3、扩展记录日志

public class CustomerActionFilterAttribute : Attribute, IActionFilter    {        private readonly ILogger<CustomerActionFilterAttribute> _logger;        public CustomerActionFilterAttribute(ILogger<CustomerActionFilterAttribute> logger)        {            _logger = logger;        }        /// <summary>        /// 在XXAction执行之前        /// </summary>        /// <param name="context"></param>        public void OnActionExecuting(ActionExecutingContext context)        {            var para = context.HttpContext.Request.QueryString.Value;            var controllerName = context.ActionDescriptor.RouteValues["controller"];            var actionName = context.ActionDescriptor.RouteValues["action"];            _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求参数是{JsonConvert.SerializeObject(para)}");        }        /// <summary>        /// 在XXAction执行之后        /// </summary>        /// <param name="context"></param>        public void OnActionExecuted(ActionExecutedContext context)        {            var para = context.Result;            var controllerName = context.ActionDescriptor.RouteValues["controller"];            var actionName = context.ActionDescriptor.RouteValues["action"];            _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求结果是{JsonConvert.SerializeObject(para)}");        }    }
public class Home1Controller : Controller    {        private readonly ILogger<HomeController> _logger;        public Home1Controller(ILogger<HomeController> logger)        {            _logger = logger;            Console.WriteLine($"执行 {this.GetType().Name} 构造函数");        }        [TypeFilter(typeof(CustomerActionFilterAttribute))]        public IActionResult Index(int id)        {            Console.WriteLine($"执行 Index 方法");            ViewBag.Data = new { name = "11111" };            return View();        }    }

 

 

 三、IAsyncActionFilter(异步)

public class CustomerAsyncActionFilterAttribute : Attribute, IAsyncActionFilter    {        private readonly ILogger<CustomerAsyncActionFilterAttribute> _logger;        public CustomerAsyncActionFilterAttribute(ILogger<CustomerAsyncActionFilterAttribute> logger)        {            _logger = logger;        }        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)        {            var para = context.HttpContext.Request.QueryString.Value;            var controllerName = context.ActionDescriptor.RouteValues["controller"];            var actionName = context.ActionDescriptor.RouteValues["action"];            _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求参数是{JsonConvert.SerializeObject(para)}");                        var excuteContext = await next.Invoke(); // 这句话就是去执行Action            _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求结果是{JsonConvert.SerializeObject(excuteContext.Result)}");        }    }
public class Home1Controller : Controller    {        private readonly ILogger<HomeController> _logger;        public Home1Controller(ILogger<HomeController> logger)        {            _logger = logger;            Console.WriteLine($"执行 {this.GetType().Name} 构造函数");        }        //[TypeFilter(typeof(CustomerActionFilterAttribute))]        [TypeFilter(typeof(CustomerAsyncActionFilterAttribute))]        public IActionResult Index(int id)        {            Console.WriteLine($"执行 Index 方法");            ViewBag.Data = new { name = "11111" };            return View();        }    }

 

 

 

 

四、总结

作用:该Filter可以记录Action执行前后的参数和结果

执行顺序:1、执行控制器的构造函数2、执行CustomerActionFilterAttribute.OnActionExecuting3、执行Action方法4、执行CustomerActionFilterAttribute.OnActionExecuted

 

posted @ 2022-02-21 22:47 SportSky 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员