一、简介
在.net core 中Filter分为以下六大类:
1、AuthorizeAttribute(权限验证)
2、IResourceFilter(资源缓存)
3、IActionFilter(执行方法前后的记录)
4、IResultFilter(结果生成前后扩展)
5、IAlwaysRun(响应结果的补充)
6、IExceptionFilter(异常处理)
二、IActionFilter(同步)
1、定义Filter
public class CustomerActionFilterAttribute : Attribute, IActionFilter
{
/// <summary>
/// 在XXAction执行之前
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuting");
}
/// <summary>
/// 在XXAction执行之后
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine("CustomerActionFilterAttribute.OnActionExecuted");
}
}
2、使用Filter
public class Home1Controller : Controller
{
private readonly ILogger<HomeController> _logger;
public Home1Controller(ILogger<HomeController> logger)
{
_logger = logger;
Console.WriteLine($"执行 {this.GetType().Name} 构造函数");
}
[CustomerActionFilter]
public IActionResult Index()
{
Console.WriteLine($"执行 Index 方法");
return View();
}
}
3、扩展记录日志
public class CustomerActionFilterAttribute : Attribute, IActionFilter
{
private readonly ILogger<CustomerActionFilterAttribute> _logger;
public CustomerActionFilterAttribute(ILogger<CustomerActionFilterAttribute> logger)
{
_logger = logger;
}
/// <summary>
/// 在XXAction执行之前
/// </summary>
/// <param name="context"></param>
public void OnActionExecuting(ActionExecutingContext context)
{
var para = context.HttpContext.Request.QueryString.Value;
var controllerName = context.ActionDescriptor.RouteValues["controller"];
var actionName = context.ActionDescriptor.RouteValues["action"];
_logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求参数是{JsonConvert.SerializeObject(para)}");
}
/// <summary>
/// 在XXAction执行之后
/// </summary>
/// <param name="context"></param>
public void OnActionExecuted(ActionExecutedContext context)
{
var para = context.Result;
var controllerName = context.ActionDescriptor.RouteValues["controller"];
var actionName = context.ActionDescriptor.RouteValues["action"];
_logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求结果是{JsonConvert.SerializeObject(para)}");
}
}
public class Home1Controller : Controller
{
private readonly ILogger<HomeController> _logger;
public Home1Controller(ILogger<HomeController> logger)
{
_logger = logger;
Console.WriteLine($"执行 {this.GetType().Name} 构造函数");
}
[TypeFilter(typeof(CustomerActionFilterAttribute))]
public IActionResult Index(int id)
{
Console.WriteLine($"执行 Index 方法");
ViewBag.Data = new { name = "11111" };
return View();
}
}

三、IAsyncActionFilter(异步)
public class CustomerAsyncActionFilterAttribute : Attribute, IAsyncActionFilter
{
private readonly ILogger<CustomerAsyncActionFilterAttribute> _logger;
public CustomerAsyncActionFilterAttribute(ILogger<CustomerAsyncActionFilterAttribute> logger)
{
_logger = logger;
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var para = context.HttpContext.Request.QueryString.Value;
var controllerName = context.ActionDescriptor.RouteValues["controller"];
var actionName = context.ActionDescriptor.RouteValues["action"];
_logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求参数是{JsonConvert.SerializeObject(para)}");
var excuteContext = await next.Invoke(); // 这句话就是去执行Action
_logger.LogInformation($"当前请求的控制器是{controllerName},方法名{actionName},请求结果是{JsonConvert.SerializeObject(excuteContext.Result)}");
}
}
public class Home1Controller : Controller
{
private readonly ILogger<HomeController> _logger;
public Home1Controller(ILogger<HomeController> logger)
{
_logger = logger;
Console.WriteLine($"执行 {this.GetType().Name} 构造函数");
}
//[TypeFilter(typeof(CustomerActionFilterAttribute))]
[TypeFilter(typeof(CustomerAsyncActionFilterAttribute))]
public IActionResult Index(int id)
{
Console.WriteLine($"执行 Index 方法");
ViewBag.Data = new { name = "11111" };
return View();
}
}

四、总结
作用:该Filter可以记录Action执行前后的参数和结果

执行顺序: 1、执行控制器的构造函数 2、执行CustomerActionFilterAttribute.OnActionExecuting 3、执行Action方法 4、执行CustomerActionFilterAttribute.OnActionExecuted
来自:https://www.cnblogs.com/sportsky/p/15920763.html
