当前位置: 首页 > news >正文

ASP.NET Core 6.0 使用 Action过滤器

Action过滤器

在ASP.NET Core中,Action过滤器用于在执行Action方法之前或之后执行逻辑。你可以创建自定义的Action过滤器来实现这一点。

继承 ActionFilterAttribute 类:

        [TypeFilter(typeof(CustomAllActionResultFilterAttribute))]public IActionResult Index4(int i){return Json(new{Id = 1,Name = "Tom",Age = 18});}

 写日志

public class CustomAllActionResultFilterAttribute:ActionFilterAttribute
{private readonly ILogger<CustomAllActionResultFilterAttribute> _ILogger;public CustomAllActionResultFilterAttribute(ILogger<CustomAllActionResultFilterAttribute> iLogger){this._ILogger = iLogger;}public override void OnActionExecuting(ActionExecutingContext context){var para = context.HttpContext.Request.QueryString.Value;var controllerName = context.HttpContext.GetRouteValue("controller");var actionName = context.HttpContext.GetRouteValue("action");_ILogger.LogInformation($"执行{controllerName}控制器--{actionName}方法;参数为:{para}");}public override void OnActionExecuted(ActionExecutedContext context){var result = Newtonsoft.Json.JsonConvert.SerializeObject(context.Result);var controllerName = context.HttpContext.GetRouteValue("controller");var actionName = context.HttpContext.GetRouteValue("action");_ILogger.LogInformation($"执行{controllerName}控制器--{actionName}方法:执行结果为:{result}");}public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next){var controllerName = context.HttpContext.GetRouteValue("controller");var actionName = context.HttpContext.GetRouteValue("action");var para = context.HttpContext.Request.QueryString.Value;_ILogger.LogInformation($"执行{controllerName}控制器--{actionName}方法;参数为:{para}");ActionExecutedContext executedContext = await next.Invoke(); //这句话执行就是去执行Action  var result = Newtonsoft.Json.JsonConvert.SerializeObject(executedContext.Result);_ILogger.LogInformation($"执行{controllerName}控制器--{actionName}方法:执行结果为:{result}");}public override void OnResultExecuting(ResultExecutingContext context){base.OnResultExecuting(context);}public override void OnResultExecuted(ResultExecutedContext context){base.OnResultExecuted(context);}public override Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next){return base.OnResultExecutionAsync(context, next);}
}

AlwaysRunResultFilter扩展定制

在之前学过的ActionFilter/ResourceFilter中只要是对HttpContext.Result赋值,就不再继续往后了。

在ASP.NET Core中,AlwaysRunResultFilter是一个实现了IAlwaysRunResultFilter接口的特性,它用于在执行结果执行之后执行一些操作,无论结果是否执行成功。

        [CustomCacheResourceFilter][CustomAlwaysRunResultFilter]public IActionResult Index5(){return Json(new{ Id =1,Name ="Tom",Age = 18});}
    public class CustomAlwaysRunResultFilterAttribute : Attribute, IAlwaysRunResultFilter{public void OnResultExecuting(ResultExecutingContext context){Console.WriteLine("CustomAlwaysRunResultFilterAttribute.OnResultExecuting");}public void OnResultExecuted(ResultExecutedContext context){Console.WriteLine("CustomAlwaysRunResultFilterAttribute.OnResultExecuted");}}

Filter的多种注册

AOP:在不修改之前的代码为基础上,动态增加功能,但是我们现在做的无论是ResourceFilter还是ActionFilter都是直接标记在方法上的,现在需要的是对某一些Action、或者对于某个项目整体生效。

方法注册:仅对当前方法生效

        [CustomCacheResourceFilter][CustomAlwaysRunResultFilter]public IActionResult Index5(){return Json(new{ Id =1,Name ="Tom",Age = 18});}


控制器(类)注册:对当前控制器下的所有Action都生效


全局注册:对于项目中的所有方法都生效,在Program.cs文件

// Add services to the container.
builder.Services.AddControllersWithViews(mvcOptions => 
{// 3.全局注册--对整个项目都生效的mvcOptions.Filters.Add<CustomCacheResourceFilterAttribute>();
});

匿名支持

单个Action注册是对于某一个Action生效,但是控制器、全局注册都是生效一大片。
那么在这样生效一部分中,如果希望在全局或者控制器注册后,其中有部分Action不生效,该怎么处理。(匿名支持)
系统提供了AllowAnonymousAttribute,有部分可以使用,有部分不能直接使用。

namespace Learn.NET6.Project.Utility.Filters
{public class CustomAllowAnonymousAttribute: Attribute{}
}
        #region 匿名支持/// <summary>/// 不支持缓存/// </summary>/// <returns></returns>//[AllowAnonymous][CustomAllowAnonymous]public IActionResult Index6(){return Json(new{ Id =1,Name ="Tom",Age=18});}#endregion

http://www.lryc.cn/news/392087.html

相关文章:

  • Java 并发集合:CopyOnWrite 写时复制集合介绍
  • Linux 查看修改系统时间| date -s
  • 数据库MySQL学习笔记
  • 四端口千兆以太网交换机与 SFP 扩展功能
  • Renderless 思想正在影响前端开发
  • maven 打包执行配置(对maven引用的包或者丢进去的包都包含在里面)打成jar包
  • Python酷库之旅-第三方库Pandas(004)
  • 天猫超市卡怎么用
  • ai智能语音机器人电销系统:让销售更快速高效
  • Redis 中的通用命令(命令的返回值、复杂度、注意事项及操作演示)
  • 【Hive实战】 HiveMetaStore的指标分析
  • 【Linux系统】CUDA的安装与graspnet环境配置遇到的问题
  • 滤波算法学习笔记
  • 【机器学习】机器学习的重要方法——线性回归算法深度探索与未来展望
  • 百度云智能媒体内容分析一体机(MCA)建设
  • 笔记本电脑部署VMware ESXi 6.0系统
  • k8s 中间件
  • 如何 提升需求确定性
  • 探索Sui的面向对象模型和Move编程语言
  • 【vue动态组件】VUE使用component :is 实现在多个组件间来回切换
  • springboot dynamic配置多数据源
  • 线性代数知识点搜刮
  • 景区智能厕所系统,打造智能化,人性化公共空间
  • Windows中Git的使用(2024最新版)
  • 【pytorch12】什么是梯度
  • 南京,协同开展“人工智能+”行动
  • Selenium IDE 的使用指南
  • vue配置sql规则
  • 面试官:Redis执行lua脚本能保证原子性吗?
  • 基于Chrome扩展的浏览器可信事件与网页离线PDF导出