一、使用演示
1.1 创建过滤器
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 局部注册
1.2.2 全局注册
builder.Services.AddControllers(o => o.Filters.Add(typeof(ActionApiFilter)));
1.3 测试
1.3.1 无token
1.3.2 有token
二、拓展—— 异步 + 日志
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}");
}
}
}