.Net6 WebApi入门(过滤器)

过滤器

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)
		{
			// 资源请求前
		} 
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值