.Net Core Aop之IActionFilter
2022-02-21 22:47
423 查看
一、简介
在.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
相关文章推荐
- ASP.NET MVC 通过ActionFilter 实现AOP设计 示例
- .Net Core 权限验证与授权(AuthorizeFilter、ActionFilterAttribute)
- .net core AOP之Filter
- 详解.Net Core 权限验证与授权(AuthorizeFilter、ActionFilterAttribute)
- loginFilter不能过滤*.action
- Minify Action Filter Attribute in ASP.NET MVC
- ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
- 为struts的action添加到SPRING的AOP日志拦截器
- 使用.net core中的类DispatchProxy实现AOP
- jsp 提交 action 中文乱码 之filter
- Use ActionFilterAttribute to check user logging
- Dora.Interception,为.NET Core度身打造的AOP框架:全新的版本
- 使用Spring的AOP拦截Struts2的Action时输出Json出错
- Spring AOP进行日志记录,管理 (使用Spring的拦截器功能获取对action中每个方法的调用情况,在方法调用前和调用后记录相关日志。)
- 返璞归真asp.net mvc 1.0(5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test
- asp.net mvc 1.0(5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test(非原创)
- Class yii\base\ActionFilter
- 在struts2 action中使用spring aop出错
- CSS filter effects in action
- ASP.NET MVC3 类面向切面AOP 的Filter操作