过滤器类型
net core 有五种过滤器,每个过滤器类型在过滤器管道中的不同阶段执行:
1:IAuthorizationFilterAttribute 授权过滤器
2:IResourceFilterAttribute 资源过滤器
3:ExceptionFilterAttribute 异常过滤器
4:ActionFilterAttribute方法过滤器
5:ResultFilterAttribute 结果过滤器
Filter 执行顺序
ActionFilterAttribute
异步环绕操作的执行和操作结果的抽象筛选器。官方文档
方法过滤器:它会在执行Action方法前后被调用。这个可以在方法中用来处理传递参数和处理方法返回结果。
属性
方法
在过滤器中使用依赖注入
有时候我们可能需要读取程序运行环境的信息,根据不同的环境做出不同的响应内容
public void OnResultExecouting(ResultExecutingContext context){ var env=(IHostingEnvironname)context.HttpContext.RequestService.GetService(typeof(IHostingEnvironment))}
示例
先定义一个WeatherForecastActionFilterAttribute的Action Filter,
using Microsoft.AspNetCore.Mvc.Controllers;using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.Filters;using System.Text.Json;namespace Net6.Filter.Demo.Filters;/// <summary>/// WeatherForecast的 Action Filter/// </summary>public class CustomerActionFilterAttribute:ActionFilterAttribute{ /// <summary> /// Action方法调用之前执行 /// </summary> /// <param name="context"></param> public override void OnActionExecuting(ActionExecutingContext context) { var descriptor = context.ActionDescriptor as ControllerActionDescriptor; string param = string.Empty; string globalParam = string.Empty; foreach (var arg in context.ActionArguments) { string value = JsonSerializer.Serialize(arg.Value); param += $"{arg.Key} : {value} \r\n"; globalParam += value; } Console.WriteLine("OnActionExecuting,Action 方法调用之前执行"); //Console.WriteLine($"webapi方法名称:【{descriptor.ActionName}】接收到参数为:{param}"); } /// <summary> /// Action 方法调用后,Result 方法调用前执行 /// </summary> /// <param name="context"></param> public override void OnActionExecuted(ActionExecutedContext context) { Console.WriteLine("OnActionExecuted,Action 方法调用后,Result 方法调用前执行"); } /// <summary> /// Result 方法调用前执行 /// </summary> /// <param name="context"></param> public override void OnResultExecuting(ResultExecutingContext context) { Console.WriteLine("OnResultExecuting,Result 方法调用前执行"); } /// <summary> /// Result 方法调用后执行 /// </summary> /// <param name="context"></param> public override void OnResultExecuted(ResultExecutedContext context) { var descriptor = context.ActionDescriptor as ControllerActionDescriptor; string result = string.Empty; if (context.Result is ObjectResult) { result = JsonSerializer.Serialize(((ObjectResult)context.Result).Value); } Console.WriteLine("OnResultExecuted,Result 方法调用后执行"); //Console.WriteLine($"webapi方法名称【{descriptor.ActionName}】执行的返回值 : {result}"); }}
再到需要使用WeatherForecastActionFilterAttribute的方法头部添加上属性标记
using Microsoft.AspNetCore.Mvc;using Net6.Filter.Demo.Filters;using Net6.Filter.Demo.Models;namespace Net6.Filter.Demo.Controllers.FilterDemo;public class FilterDemoController : AreaController{ private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"}; private readonly ILogger<FilterDemoController> _logger; public FilterDemoController(ILogger<FilterDemoController> logger) { _logger = logger; } [HttpGet(Name = "GetWeatherForecast")] [CustomerActionFilterAttribute] public IEnumerable<WeatherForecast> Get() { return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = Random.Shared.Next(-20, 55), Summary = Summaries[Random.Shared.Next(Summaries.Length)] }) .ToArray(); }}
ActionExecutedContext
操作筛选器的上下文,特别是 OnActionExecuted(ActionExecutedContext)) 调用。
属性
方法
ActionExecutingContext
操作筛选器的上下文
属性
方法
ResultExecutedContext
Properties
Methods
ResultExecutingContext
Properties
Methods