过滤器
ASP .NET Core 中共有5大Filter
- AuthorizationFilter 授权过滤器
在过滤器管道中第一个执行,通常用于验证当前请求的合法性,不合法后面的管道会直接跳过。它们只有一个Before方法,不像其它大多数过滤器支持前置阶段方法和后置阶段方法。注意,您不要在授权过滤器中抛出异常,因为没有任何代码来处理异常(异常过滤器不处理它们) - ResourceFilter 资源管理过滤器
资源过滤器是第二个运行,在 Authorization Filter 之后,Model Binding 之前执行。在性能方面,资源过滤器在实现缓存或截断过滤器管道尤为重要。 - ActionFilter 行为过滤器
使用率最高的过滤器,在调用 Acioin 方法之前和之后执行代码。跟 Resource Filter 很类似,但 Model Binding 在之后执行 - ExceptionFilter 异常过滤器
用于为应用程序执行异常处理策略。 - ResultFilter 结果过滤器
当 Action 执行完成后,最后会执行过滤器。用于处理ActionResult结果输出策略。
当请求发送到服务端后,会先经过中间件,之后会进入过滤器
以上形成了.Net6的管道处理模型(洋葱模型)
注册过滤器
过滤器有三种注册方式
- 方法注册
- 类注册
- 全局注册
方法注册
只对该方法使用这些过滤器
[HttpGet]
[ActionFilter]
public IEnumberable<weatherForecast> Get()
{
return Enumerable.Range(1, 5).selelct(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
类注册
Filter会对当前类控制器下的所有方法生效
相同类型的Filter在类上注册的先于方法上注册的,不同类型的Filter按照上文所说的顺序执行,比如在方法上标注了授权Filter,在类上标注了一个行为过滤器,还是会优先执行方法上标注的授权Filter
[ApiController]
[Route("[controller]")]
[ActionFilter]
public class weatherForecasetController : BaseApiController<IUserService>
{
}
全局注册
对当前项目中所有的控制器方法生效,一般来说,全局过滤器优先于类过滤器和方法过滤器,但不同过滤器之间的执行顺序与上文中所说的一样
builder.Services.AddControllers(o => o.Filters.Add(typeof(CtmActionFilterAttribute)));
如何自定义一个Filter
创建Filters文件夹
定义 ActionFilter
using Microsoft.AspNetCore.Mvc.Filters;
namespace FilterDemo.API.Filters
{
public class CtmActionFileterAttribute : Attribute, IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
// 方法执行完之后执行
}
public void OnActionExecuting(ActionExecutingContext context)
{
// 方法执行前执行
}
}
}
定义AuthorizationFilter
using Microsoft.AspNetCore.Mvc.Filters;
namespace FilterDemo.API.Filters
{
public class CtmAuthorizationFilterAttribute : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
throw new NotImplementedException();
}
}
}
ResourceFilter
using Microsoft.AspNetCore.Mvc.Filters;
namespace FilterDemo.API.Filters
{
public class CtmResourceFilterAttribute : Attribute, IResourceFilter
{
public void OnResourceExecuted(ResourceExecutedContext context)
{
// 资源请求后
}
public void OnResourceExecuting(ResourceExecutedContext context)
{
// 资源请求前
}
}
}