.Net6对AOP的多种支持之IAsyncActionFilter

环境:   .Net6    windows10   Web项目  ps:Log4net写入到文件以及写入到数据库中

开发工具: Vs2022

IAsyncActionFilter(日志异步实现)

 

IAsynctionFilter概念

   ASP.NET Core6提供的是接口IAsyncActionFilter/ActionFilterAttribute

系统框架提供的抽象(接口(异步实现)/抽象类),可以是自定义扩展,也可以直接使用

通过一个特性的支持

作用是做日志,更加贴合Action,缓存也能做,但是专人做专事,用它来做日志会更好

 

执行顺序

    实现的接口里有个委托参数,执行这个委托(就是执行Action方法),所以需要以这个委托执行为界限,可在之前或者之后添加

需要执行的。

 

实现IAsyncActionFilter

定义特性类

       名称以Attribute结尾(标记特性时可以省略),继承Attribute、IAsyncActionFilter(并实现该接口)

      public class CustomIActionFilecuting(ActionExecutingContext context)   

这里的执行顺序会是在构造函数执行以后,Action执行之前执行

            

实现接口

            public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)

 执行next委托就会执行Action,以这个委托执行为界限,可在之前或者之后添加

需要执行的。

 

加入特性标记

   在需要做日志的方法上标记特性

        [TypeFilter(typeof(CustomIAsyncActionFilterAttribute))]

        public IActionResult index3(int id ){

            return View();

        }

 

完整Code示例

using Microsoft.AspNetCore.Mvc.Filters;

namespace WebApplication1.Untity.Filters
{

    /// <summary>
    /// 异步ActionFilter
    /// </summary>
    public class CustomIAsyncActionFilterAttribute : Attribute, IAsyncActionFilter
    {


        //构造函数注入
        private readonly ILogger<CustomIAsyncActionFilterAttribute> _logger;
        public CustomIAsyncActionFilterAttribute(ILogger<CustomIAsyncActionFilterAttribute> logger) 
        {
            this._logger = logger;
        }
        
        /// <summary>
        /// 实现接口方法
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next">执行委托就会执行Action</param>
        /// <returns></returns>
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var para = context.HttpContext.Request.QueryString.Value;
            var controllerName = context.HttpContext.GetRouteValue("controller");
            var actionName = context.HttpContext.GetRouteValue("action");
           
            
            _logger.LogInformation($"执行{controllerName}控制器的{actionName}方法,参数是:{para}");
            Console.WriteLine("之前");

            ActionExecutedContext executedContext = await next.Invoke();//这里就是执行Action
            Console.WriteLine("之后");
            var result = Newtonsoft.Json.JsonConvert.SerializeObject(executedContext.Result);
            _logger.LogInformation($"执行{controllerName}控制器的{actionName}方法,结果是:{result}");

        }
    }
}

 

 

        //[TypeFilter(typeof(CustomIActionFilterAttribute))]
        [TypeFilter(typeof(CustomIAsyncActionFilterAttribute))]
        public IActionResult index3(int id )
        {

            ViewBag.user = Newtonsoft.Json.JsonConvert.SerializeObject(new
            {
                Id = id,
                Name = "John--ViewBag",
                Age = 18
            });

            ViewData["UserInfo"] = Newtonsoft.Json.JsonConvert.SerializeObject(new
            {
                Id = id,
                Name = "John --ViewData",
                Age = 18
            });

            object description = "参数测试啊啊啊啊";

            return View(description);
        }

 

posted @ 2023-02-15 00:46  唐什么来着  阅读(631)  评论(0编辑  收藏  举报