.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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!