.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.OnActionExecuting
3、執行Action方法
4、執行CustomerActionFilterAttribute.OnActionExecuted

 


免責聲明!

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



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