一、简介

在.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

.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. Vue项目中使用websocket

    <template> <div class="test"> </div> </template> <script> ex ...

  2. docker的安装以及使用命令

    docker的安装 安装docker https://docs.docker.com/install/linux/docker-ce/centos/#set-up-the-repository 从 2 ...

  3. C#进程调用FFmpeg操作音视频

    项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂 ...

  4. 《剑指offer》面试题05. 替换空格

    问题描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20a ...

  5. vue 快速入门 系列 —— 实例方法(或 property)和静态方法

    其他章节请看: vue 快速入门 系列 实例方法(或 property)和静态方法 在 Vue(自身) 项目结构 一文中,我们研究了 vue 项目自身构建过程,也知晓了 import Vue from ...

  6. 数据库备份还原 mysqldump

    1.备份全部数据库的数据和结构mysqldump -uroot -p123456 --all-databases >all.bakmysqldump -uroot -p123456 -A > ...

  7. ES6新增的数组的方法

    forEach forEach()会遍历数组, 循环体内没有返回值,forEach()循环不会改变原来数组的内容, forEach()有三个参数, 第一个参数是当前元素, 第二个参数是当前元素的索引, ...

  8. ORB_SLAM3 + ROS采坑实录(从零开始的毕设生活第一弹)

    ORB-SLAM3配置 https://github.com/UZ-SLAMLab/ORB_SLAM3 https://github.com/shanpenghui/ORB_SLAM3_Fixed E ...

  9. 线程终止的四种方式,interrupt 方法使用的简单介绍。

    一 正常结束. package com.aaa.threaddemo; /* 一 终止线程的四种方式? * 程序运行结束,线程终止. * */ public class ThreadTerminati ...

  10. Java多线程基础-ThreadLocal

    感谢原文作者:Yuicon 原文链接:https://segmentfault.com/a/1190000016705955 序 在多线程环境下,访问非线程安全的变量时必须进行线程同步,例如使用 sy ...