Filter 筛选器(一)之 ActionFilter-- IAsyncActionFilter 和 ActionFilterAttribute

微软官网例子:Filter筛选器

使用场景(执行顺序):

image

IAsyncActionFilter

使用异步actionFilter 只需要实现 他的 :OnActionExecutionAsync 方法 (注意这里的异步不是拦截异步是指的是 当前OnActionExecutionAsync方法内执行的内容是异步的)
例如:我在这里注入两个 ActionbFliter (MyActionFilter1 和 MyActionFilter2)
注意 : 多个Filter 执行是一个链路形式的

MyActionFilter1

public class MyActionFilter1 : IAsyncActionFilter
{
	public async Task OnActionExecutionAsync(ActionExecutingContext context, 
		ActionExecutionDelegate next)
	{
		Console.WriteLine("MyActionFilter 1:开始执行");
		ActionExecutedContext r = await next(); //如果执行 下一个ActionFilter
		if (r.Exception != null)
		{
			Console.WriteLine("MyActionFilter 1:执行失败");
		}
		else
		{
			Console.WriteLine("MyActionFilter 1:执行成功");
		}
	}
}

MyActionFilter2

public class MyActionFilter2 : IAsyncActionFilter
{
	public async Task OnActionExecutionAsync(ActionExecutingContext context, 
		ActionExecutionDelegate next)
	{
		Console.WriteLine("MyActionFilter 2:开始执行");
		ActionExecutedContext r = await next();
		if (r.Exception != null)
		{
			Console.WriteLine("MyActionFilter 2:执行失败");
		}
		else
		{
			Console.WriteLine("MyActionFilter 2:执行成功");
		}
	}
}

可以看到多个执行的效果

如上图,他是一个链路形式 !

也可以使用 ActionFilterAttribute

可以看到 ActionFilterAttribute 包含了 IAsyncActionFilter 接口 和 IAsyncResultFilter 接口

例子 :

 public class ActionAttribute : ActionFilterAttribute
    {
        private readonly ILogger<HandleActionAttribute> _logger;
        public HandleActionAttribute(ILogger<ActionAttribute> logger)
        {
            _logger = logger;
        }
        // 这里需要重写父类的 virtual OnActionExecutionAsync() 方法
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {

            HttpRequest request = ((Microsoft.AspNetCore.Mvc.ControllerBase)context.Controller).Request;
            AuthParam param = GetParameters(request);
            CheckParameters(param);
           //逻辑处理 省略
           await base.OnActionExecutionAsync(context, next);  
    }

调用的时候

[TypeFilter(typeof(ActionAttribute))]

Demo

一般我们程序会使用两个Filter
(检测权限)在方法执行之前进行判断

例如:

作者:Bo-H

出处:https://www.cnblogs.com/Bo-H/p/16584380.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Bo-Hong  阅读(1019)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题