.net5 实现 IActionFilter 实现自定义过滤器
一 通过实现 IActionFilter 实现自定义过滤器
1 自定义过滤器对应的特性
public class ImpIActionFilterDescAttribute : Attribute { public string Code { get; set; } public string Desc { get; set; } public ImpIActionFilterDescAttribute(string code,string desc) { Code = code; Desc = desc; } }
2 自定义过滤器
/// <summary> /// 实现 IActionFilter 接口的过滤器 /// </summary> public class ImpIActionFilter : IActionFilter { // 在方法执行完后调用的逻辑 public void OnActionExecuted(ActionExecutedContext context) { // 获取controller var controller = context.Controller; #region 判断 controller 上是否有该拦截特性 var impIActionFilterDescAttribut_controller = controller.GetType().GetCustomAttribute<ImpIActionFilterDescAttribute>(); if (impIActionFilterDescAttribut_controller != null && impIActionFilterDescAttribut_controller.Code.Length > 2) { // 将Result设置为非空值使过滤器管道短路,会阻止管道的其余部分执行 context.Result = new JsonResult("[controller]无权访问..."); return; } #endregion #region 如果 controller 无该拦截特性再判断该 action 是否有该拦截特性 if (context.ActionDescriptor.RouteValues.ContainsKey("action")) { // 获取当前action名 var actionName = context.ActionDescriptor.RouteValues["action"]; var impIActionFilterDescAttribute_action = controller.GetType().GetMethod(actionName).GetCustomAttribute<ImpIActionFilterDescAttribute>(); if(impIActionFilterDescAttribute_action != null && impIActionFilterDescAttribute_action.Code.Length>2) { // 将Result设置为非空值使过滤器管道短路,会阻止管道的其余部分执行 context.Result = new JsonResult("[action]无权访问..."); } } #endregion } // 在方法执行前调用的逻辑 public void OnActionExecuting(ActionExecutingContext context) { Console.WriteLine("在方法执行前调用的逻辑"); } }
3 在 Startup.cs 注册过滤器,这里用之前写的 MyActionFilter 做实例,ImpIActionFilter 注册方式类似,这样所有的请求都会被该过滤器处理
mvc 项目注册自定义的过滤器

web api 项目注册自定义的过滤器

4 在 controller 中使用自定义的过滤器
在 controller上标记,这样该 controller 下的所有 action都会被过滤器处理
[ApiController] [Route("[controller]/[action]")] [ImpIActionFilterDesc("C001", "被拦截")] public class ImpIActionFilterController2 : ControllerBase { [HttpGet] public IActionResult Test1() { return new JsonResult("执行完成"); } [HttpGet] public IActionResult Test2() { return new JsonResult("执行完成"); } }
只在 action 上标记该拦截特性,这样只有标记了该特性的action与该拦截器想结婚
[ApiController] [Route("[controller]/[action]")] public class ImpIActionFilterController : ControllerBase { [HttpGet] [ImpIActionFilterDesc("C001", "被拦截")] public IActionResult WillBeFilter() { return new JsonResult("执行完成"); } [HttpGet] public IActionResult WillNotBeFilter() { return new JsonResult("执行完成"); } }
参考链接
https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?view=aspnetcore-6.0

浙公网安备 33010602011771号