一、简介

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

1、AuthorizeAttribute(权限验证)

2、IResourceFilter(资源缓存)

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

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

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

6、IExceptionFilter(异常处理)

二、IActionFilter(同步)

1、定义Filter

  1. public class CustomerActionFilterAttribute : Attribute, IActionFilter
  2. {
  3. /// <summary>
  4. /// 在XXAction执行之前
  5. /// </summary>
  6. /// <param name="context"></param>
  7. public void OnActionExecuting(ActionExecutingContext context)
  8. {
  9. Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuting");
  10. }
  11.  
  12. /// <summary>
  13. /// 在XXAction执行之后
  14. /// </summary>
  15. /// <param name="context"></param>
  16. public void OnActionExecuted(ActionExecutedContext context)
  17. {
  18. Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuted");
  19. }
  20.  
  21. }

2、使用Filter

  1. public class Home1Controller : Controller
  2. {
  3. private readonly ILogger<HomeController> _logger;
  4.  
  5. public Home1Controller(ILogger<HomeController> logger)
  6. {
  7. _logger = logger;
  8. Console.WriteLine($"执行 {this.GetType().Name} 构造函数");
  9. }
  10.  
  11. [CustomerActionFilter]
  12. public IActionResult Index()
  13. {
  14. Console.WriteLine($"执行 Index 方法");
  15. return View();
  16. }
  17. }

3、扩展记录日志

  1. public class CustomerActionFilterAttribute : Attribute, IActionFilter
  2. {
  3.  
  4. private readonly ILogger<CustomerActionFilterAttribute> _logger;
  5.  
  6. public CustomerActionFilterAttribute(ILogger<CustomerActionFilterAttribute> logger)
  7. {
  8. _logger = logger;
  9. }
  10. /// <summary>
  11. /// 在XXAction执行之前
  12. /// </summary>
  13. /// <param name="context"></param>
  14. public void OnActionExecuting(ActionExecutingContext context)
  15. {
  16. var para = context.HttpContext.Request.QueryString.Value;
  17. var controllerName = context.ActionDescriptor.RouteValues["controller"];
  18. var actionName = context.ActionDescriptor.RouteValues["action"];
  19.  
  20. _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求参数是{JsonConvert.SerializeObject(para)}");
  21.  
  22. }
  23.  
  24. /// <summary>
  25. /// 在XXAction执行之后
  26. /// </summary>
  27. /// <param name="context"></param>
  28. public void OnActionExecuted(ActionExecutedContext context)
  29. {
  30. var para = context.Result;
  31. var controllerName = context.ActionDescriptor.RouteValues["controller"];
  32. var actionName = context.ActionDescriptor.RouteValues["action"];
  33. _logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求结果是{JsonConvert.SerializeObject(para)}");
  34.  
  35. }
  36. }
  1. public class Home1Controller : Controller
  2. {
  3. private readonly ILogger<HomeController> _logger;
  4.  
  5. public Home1Controller(ILogger<HomeController> logger)
  6. {
  7. _logger = logger;
  8. Console.WriteLine($"执行 {this.GetType().Name} 构造函数");
  9. }
  10.  
  11. [TypeFilter(typeof(CustomerActionFilterAttribute))]
  12. public IActionResult Index(int id)
  13. {
  14. Console.WriteLine($"执行 Index 方法");
  15. ViewBag.Data = new { name = "11111" };
  16. return View();
  17. }
  18. }

三、IAsyncActionFilter(异步)

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

四、总结

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

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

.Net Core Aop之IActionFilter的更多相关文章

  1. Asp.net Core AOP实现(采用Autofac)

    引用正确的库来实现AOP 新的.NET Core是基于.NET Standard的..所以我们在引用库的时候特别要注意相关的兼容问题. 在传统的ASP.NET中,使用过Autofac来进行AOP操作的 ...

  2. .Net Core Aop之IResourceFilter

    一.简介 在.net core 中Filter分为一下六大类: 1.AuthorizeAttribute(权限验证) 2.IResourceFilter(资源缓存) 3.IActionFilter(执 ...

  3. .Net Core AOP之AuthorizeAttribute

    一.简介 在.net core 中Filter分为以下六大类: 1.AuthorizeAttribute(权限验证) 2.IResourceFilter(资源缓存) 3.IActionFilter(执 ...

  4. .Net Core AOP之IResultFilter

    一.简介 在.net core 中Filter分为以下六大类: 1.AuthorizeAttribute(权限验证) 2.IResourceFilter(资源缓存) 3.IActionFilter(执 ...

  5. .Net Core AOP之IExceptionFilter

    一.简介 在.net core 中Filter分为以下六大类: 1.AuthorizeAttribute(权限验证) 2.IResourceFilter(资源缓存) 3.IActionFilter(执 ...

  6. .net core AOP之Filter

    当我们进行项目开发时,往往在开发过程中需要临时加入一些常用功能性代码,如身份验证.日志记录.异常获取等功能.如果每个方法中都加入这些功能性代码的话,无疑使项目显得过于臃肿,代码繁杂.这时候就要加入过滤 ...

  7. ASP.NET Core MVC中的IActionFilter.OnActionExecuting方法,可以获取Controller的Action方法参数值

    用过ASP.NET Core MVC中IActionFilter拦截器的开发人员,都知道这是一个非常强大的MVC拦截器.最近才发现IActionFilter的OnActionExecuting方法,甚 ...

  8. ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中

    我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...

  9. 面向复杂应用,Node.js中的IoC容器 -- Rockerjs/core

    Rockerjs Core 项目地址 项目主页 基于 TypeScript 和注解的轻量级IoC容器,提供了依赖注入.面向切面编程及异常处理等功能.Rockerjs Core可在任意工程中引入,是一个 ...

随机推荐

  1. CSS命名规范整理

    基于网易NEC修改后,整理的命名规范 单行写完一个选择器定义 便于选择器的寻找和阅读,也便于插入新选择器和编辑,便于模块等的识别.去除多余空格,使代码紧凑减少换行. 如果有嵌套定义,可以采取内部单行的 ...

  2. 【原创】美团二面:聊聊你对 Kafka Consumer 的架构设计

    在上一篇中我们详细聊了关于 Kafka Producer 内部的底层原理设计思想和细节, 本篇我们主要来聊聊 Kafka Consumer 即消费者的内部底层原理设计思想. 1.Consumer之总体 ...

  3. 【刷题-LeetCode】122 Best Time to Buy and Sell Stock II

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  4. gorm中的高级查询

    智能选择字段 GORM 允许通过 Select 方法选择特定的字段,如果您在应用程序中经常使用此功能,你也可以定义一个较小的结构体,以实现调用 API 时自动选择特定的字段,例如: type User ...

  5. sed 模式空间 保持空间

    sed之所以能以行为单位的编辑或修改文本,其原因在于它使用了两个空间:一个是活动的"模式空间(pattern space)",另一个是起辅助作用的"保持空间(hold s ...

  6. jenkins pipeline设置

    转:https://mp.weixin.qq.com/s/MwyBsUWUQASGMr_erGfzZA

  7. postgresql dba常用sql查询语句

    查看帮助命令 DB=# help --总的帮助 DB=# \h --SQL commands级的帮助 DB=# \? --psql commands级的帮助 \dn[S+] [PATTERN],其中[ ...

  8. Luogu_P1613跑路

    跳转链接 题目大意 题目中要求的是从1号点到n号点所需要的最短时间, 一秒可以走 \(2^k\) 个距离 给定的有向图的边边权都是1. 问题分析 由于一秒可以走 \(2^k\) 个距离,因此题目转化为 ...

  9. AT2402 [ARC072D] Dam

    首先我们可以将 \(t_i \times v_i\) 看作一个整体,不妨令 \(x_i = v_i, y_i = t_i \times v_i\) 这样两堆水混合后相当于将两个维度相加,方便了计算. ...

  10. SP19149 INS14H - Virus Revisited

    可以发现,如果一个整体一起考虑是不能找到一个合适的状态来描述这个情形的. 因此可以考虑寻找整体的反面,也就是将每个维度分开考虑. 不难发现每个维度本质上是一样的,因此不需要考虑不同维度之间的区别. 那 ...