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

微软官网例子:Filter筛选器

使用场景(执行顺序):

IAsyncActionFilter

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

.Net Code Filter 筛选器(一)之 ActionFilter-- IAsyncActionFilter 和 ActionFilterAttribute_第1张图片

.Net Code Filter 筛选器(一)之 ActionFilter-- IAsyncActionFilter 和 ActionFilterAttribute_第2张图片

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:执行成功");
		}
	}
}

可以看到多个执行的效果

.Net Code Filter 筛选器(一)之 ActionFilter-- IAsyncActionFilter 和 ActionFilterAttribute_第3张图片

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

也可以使用 ActionFilterAttribute

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

.Net Code Filter 筛选器(一)之 ActionFilter-- IAsyncActionFilter 和 ActionFilterAttribute_第4张图片

例子 :

 public class ActionAttribute : ActionFilterAttribute
    {
        private readonly ILogger _logger;
        public HandleActionAttribute(ILogger 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))]

你可能感兴趣的:(.Net,Core,C#,java,c#,开发语言)