.NET ActionFilter行为过滤器

85 阅读1分钟

一、使用演示

1.1 创建过滤器

image.png

using Microsoft.AspNetCore.Mvc.Filters;

namespace ResultFilter
{
    public class ActionApiFilter:ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            try
            {
                string token1 = context.HttpContext.Request.Headers["action"].ToString();
                string token = context.HttpContext.Request.Headers["OrgId"].ToString();
                if (token == "123")
                {
                    base.OnActionExecuting(context);
                }
                else
                {
                    throw new Exception("请求非法来源");
                }
            }catch (Exception ex)
            {
                throw new Exception("请求非法来源");
            }
        }

        public override void OnActionExecuted(ActionExecutedContext context)
        {
            Console.WriteLine("进入action之后,返回result前");
        }

        public override void OnResultExecuted(ResultExecutedContext context)
        {
            Console.WriteLine("返回result之后");
        }

        public override void OnResultExecuting(ResultExecutingContext context)
        {
            Console.WriteLine("返回result之前");
        }
    }
}

1.2 服务注册

1.2.1 局部注册

image.png

1.2.2 全局注册

builder.Services.AddControllers(o => o.Filters.Add(typeof(ActionApiFilter)));

image.png

1.3 测试

1.3.1 无token

image.png

1.3.2 有token

image.png

image.png

二、拓展—— 异步 + 日志

2.1 修改控制器

[HttpGet(Name = "GetWeatherForecast")]
public IActionResult Get(string name,int age)
{
    Console.WriteLine("执行方法");

    return Ok(new
    {
        name = name,
        age = age
    });

}

2.2 修改过滤器

using Microsoft.AspNetCore.Mvc.Filters;
using Newtonsoft.Json;
using System.Text.Json.Serialization;

namespace StartUp.Filters
{
    public class ActionApiFilter :  Attribute, IAsyncActionFilter
    {

        private readonly ILogger<ActionApiFilter> logger;

        public ActionApiFilter(ILogger<ActionApiFilter> logger)
        {
            this.logger = logger;
        }

        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            var controllerName = context.HttpContext.GetRouteValue("controller");
            var actionrName = context.HttpContext.GetRouteValue("action");
            var para = context.HttpContext.Request.QueryString.Value;

            logger.LogInformation($"执行的控制器为{controllerName},执行的方法为{actionrName},参数为{para}");

            ActionExecutedContext actionExecutedContext = await next.Invoke();

            var res = JsonConvert.SerializeObject(actionExecutedContext.Result);
            logger.LogInformation($"执行的控制器为{controllerName},执行的方法为{actionrName},执行的结果为{res}");
        }
    }
}

2.3 测试

image.png