.Net6对AOP的多种支持之IAsyncActionFilter
环境: .Net6 windows10 Web项目 ps:Log4net写入到文件以及写入到数据库中
开发工具: Vs2022
IAsyncActionFilter(日志异步实现)
IAsynctionFilter概念
ASP.NET Core6提供的是接口IAsyncActionFilter/ActionFilterAttribute
系统框架提供的抽象(接口(异步实现)/抽象类),可以是自定义扩展,也可以直接使用
通过一个特性的支持
作用是做日志,更加贴合Action,缓存也能做,但是专人做专事,用它来做日志会更好
执行顺序
实现的接口里有个委托参数,执行这个委托(就是执行Action方法),所以需要以这个委托执行为界限,可在之前或者之后添加
需要执行的。
实现IAsyncActionFilter
定义特性类
名称以Attribute结尾(标记特性时可以省略),继承Attribute、IAsyncActionFilter(并实现该接口)
public class CustomIActionFilecuting(ActionExecutingContext context)
这里的执行顺序会是在构造函数执行以后,Action执行之前执行
实现接口
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
执行next委托就会执行Action,以这个委托执行为界限,可在之前或者之后添加
需要执行的。
加入特性标记
在需要做日志的方法上标记特性
[TypeFilter(typeof(CustomIAsyncActionFilterAttribute))]
public IActionResult index3(int id ){
return View();
}
完整Code示例
using Microsoft.AspNetCore.Mvc.Filters; namespace WebApplication1.Untity.Filters { /// <summary> /// 异步ActionFilter /// </summary> public class CustomIAsyncActionFilterAttribute : Attribute, IAsyncActionFilter { //构造函数注入 private readonly ILogger<CustomIAsyncActionFilterAttribute> _logger; public CustomIAsyncActionFilterAttribute(ILogger<CustomIAsyncActionFilterAttribute> logger) { this._logger = logger; } /// <summary> /// 实现接口方法 /// </summary> /// <param name="context"></param> /// <param name="next">执行委托就会执行Action</param> /// <returns></returns> public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var para = context.HttpContext.Request.QueryString.Value; var controllerName = context.HttpContext.GetRouteValue("controller"); var actionName = context.HttpContext.GetRouteValue("action"); _logger.LogInformation($"执行{controllerName}控制器的{actionName}方法,参数是:{para}"); Console.WriteLine("之前"); ActionExecutedContext executedContext = await next.Invoke();//这里就是执行Action Console.WriteLine("之后"); var result = Newtonsoft.Json.JsonConvert.SerializeObject(executedContext.Result); _logger.LogInformation($"执行{controllerName}控制器的{actionName}方法,结果是:{result}"); } } }
//[TypeFilter(typeof(CustomIActionFilterAttribute))] [TypeFilter(typeof(CustomIAsyncActionFilterAttribute))] public IActionResult index3(int id ) { ViewBag.user = Newtonsoft.Json.JsonConvert.SerializeObject(new { Id = id, Name = "John--ViewBag", Age = 18 }); ViewData["UserInfo"] = Newtonsoft.Json.JsonConvert.SerializeObject(new { Id = id, Name = "John --ViewData", Age = 18 }); object description = "参数测试啊啊啊啊"; return View(description); }