一、简介

在.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. 10个JS技巧

    1.过滤唯一值 Set 对象是es6新引入的,配合扩展运算符[...]一起使用,我们可以用它来过滤数组的唯一值. const array = [1, 1, 2, 3, 5, 5, 1] const u ...

  2. 制作JavaCV应用依赖的基础Docker镜像(CentOS7+JDK8+OpenCV4)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. 论文解读GCN 1st《 Deep Embedding for CUnsupervisedlustering Analysis》

    论文信息 Tittle:<Spectral Networks and Locally Connected Networks on Graphs> Authors:Joan Bruna.Wo ...

  4. 【记录一个问题】opencv中 cv::dft()与cv::ocl_dft()计算的结果相差较大

    以一个跟踪算法来测试: 使用cv::dft(), 矩阵未按照2次幂对齐,最终跟踪平均准确率 84.3% 使用cv::dft(),矩阵使用cv::copyMakeBorder对齐,最终跟踪平均准确率 8 ...

  5. 【记录一个问题】MariaDB 10.1.9 中with rollup的神器问题

    我想统计每天数据的处理状态的汇总,于是写了这样一条语句: 1 select * from ( 2 select ifnull(date(update_time),'_30天汇总') as dtm, i ...

  6. 桥接模式(Bridge模式)

    桥接模式的定义与特点 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化.它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度.通过上面的讲解,我们能很好 ...

  7. golang中的go get命令

    ### 下载指定版本 go get k8s.io/klog@v1.0.0 go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装. 这个命令在内部实际上分成了两 ...

  8. Servlet程序常见错误

    常见错误1:url-pattern中配置的路径没有以斜杠打头. 常见错误2:servlet-name配置的值不存在 常见错误3:servlet-class 标签的全类名配置错误

  9. 学习JAVAWEB 第三十六天

    今天改了一天的bug 使用eclipse出现的问题:首先lib文件夹的名字是不可以更改的它放在WEB-INF文件夹下,放所有的jar包,使用时一定不要忘了将jar包添加至构建路径tomcat的部署问题 ...

  10. Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization

    目录 Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization 1.Abstract 2.Intr ...