ASP.NET CORE[练习12]-Filter筛选器

本文详细介绍了ASP.NET CORE中Filter筛选器的类型、作用域和执行顺序,包括授权筛选器、资源筛选器、操作筛选器、异常筛选器和结果筛选器的使用。通过实例讲解了筛选器的实现方式、依赖注入以及如何自定义筛选器进行授权验证和异常处理。此外,还探讨了筛选器与中间件的结合使用。
摘要由CSDN通过智能技术生成

练习+博客,量化自己的进步!

此博文是参考微软官方文档写的,加上自己的亲自实测,用自己理解的方式整理一下。

Filter筛选器,在Action之前或之后执行的代码!可以用来做授权校验、异常处理、日志记录、缓存、配置等工作。

筛选器的类型有:

  • 授权筛选器       校验用户是否登录、是否拥有权限等。
  • 资源筛选器       
  • 操作筛选器
  • 异常筛选器       异常处理,可以做一个全局异常捕获,将异常信息在指定的异常页面展示。
  • 结果筛选器

筛选器的类型还是挺多的,但它们也是有执行顺序的。

实现

筛选器的实现有两种写法,同步、异步。

同步的:

public class MySampleActionFilter : IActionFilter
{
	public void OnActionExecuting(ActionExecutingContext context)
    {
        throw new NotImplementedException();
    }
	
    public void OnActionExecuted(ActionExecutedContext context)
    {
        throw new NotImplementedException();
    }
}

这是一个同步的写法,继承IActionFilter,是一个操作筛选器,两个方法,OnActionExecting(之前)、OnActionExecuted(之后)。

异步的:

public class MySampleAsyncActionFilter : IAsyncActionFilter
{
    // 注意方法为 async
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // Do something before
        // next() 后,才会在Action之后执行代码
        var resultContext = await next();
        // Do something after
    }
}

异步的就是将同步的两个方法合并起来了,异步的next()使用不使用可以灵活决定,格式如上(下面实例的内容将不会再使用异步的)。

  • 筛选器可以实现多个类型的接口,如同时实现IActionFilter、IResultFilter.
  • 筛选器的同步和异步版本可以同时存在,但运行时只调用一种,只调用异步的,即运行时优先使用异步的版本。

筛选器作用域和执行顺序

筛选器可以作用到Action、Controller或者全局的。

全局筛选器:

services.AddMvc(options=> {
    options.Filters.Add(new MySampleActionFilter());
    options.Filters.Add(typeof(MySampleActionFilter));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

这个就是将上面自定已的筛选器添加到全局筛选器的,new、typeof两种写法都可以。在startup.cs文件中添加。

不同作用域的筛选器也有执行顺序:

  • 全局的 before
  •    Controller的before
  •         Action的before
  •         Action的after
  •    Controller的before
  • 全局的 after

控制器和Razor页面及筛选器

除了上面三个作用域的筛选器之外,还有这个筛选器:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        base.OnActionExecuting(context);
    }
    public override void OnActionExecuted(ActionExecutedContext context)
    {
        base.OnActionExecuted(context);
    }
}

写在Controller中的筛选器,这个优先级跟高,最先执行此before,最后执行此after。

  • HomeController.OnActionExecting
  •  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值