asp,net core 3.1 的过滤器(筛选器)

过滤器执行顺序

  • Authorization filters r最先运行,用于确定是否已针对请求为用户授权。 如果请求未获授权,授权筛选器可以让管道短路。
  • Resource filters:
    • 授权后运行。
    • OnResourceExecuting 在筛选器管道的其余阶段之前运行代码。 例如,OnResourceExecuting 在模型绑定之前运行代码。
    • OnResourceExecuted 在管道的其余阶段完成之后运行代码。
  • Action filters:
    • 在调用操作方法之前和之后立即运行代码。
    • 可以更改传递到操作中的参数。
    • 可以更改从操作返回的结果。
    • 页面 支持 Razor 。
  • Exception filters 在向响应正文写入任何内容之前,对未经处理的异常应用全局策略。
  • Result filters 在执行操作结果之前和之后立即运行代码。 仅当操作方法成功执行时,它们才会运行。 对于必须围绕视图或格式化程序的执行的逻辑,它们很有用。
img

同步和异步

当要创建过滤器时,应该实现 IXXXFilter 或 IAsyncXXXFilter,这两个接口的区别是前者同步、后者异步。ASP.NET Core MVC 会首先检查异步实现,如果没有实现异步方式,则继续检查同步实现,因此在创建过滤器时,不需要同步接口和异步接口都实现。

public interface IAsyncActionFilter : IFilterMetadata
{
	Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
}
                                
public interface IActionFilter : IFilterMetadata
{
    void OnActionExecuted(ActionExecutedContext context);
    void OnActionExecuting(ActionExecutingContext context);
}

public class CustomActionFilter : IActionFilter,IAsyncActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
    // Action执行之前
    }
    public void OnActionExecuted(ActionExecutedContext context)
    {
    //Action执行之后
    }
    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
    // Action执行之前
    await next();
    // Action执行之后
    }
}

OnActionExecutionAsync 方法,该方法的第二个参数ActionExecutionDelegate 表示要执行的 Action,它是一个委托类型,因此在这个方法的内部可以直接调用 next(),并在 next() 前后执行相应的代码。

筛选器作用域和执行顺序

可以将筛选器添加到管道中的以下三个 范围 之一:

  • 在控制器操作上使用属性。 筛选器属性不能应用于 Razor 页面处理程序方法。
  • 在控制器或页上使用特性 Razor 。
  • 针对所有控制器、操作和页面全局 Razor 显示,如以下代码所示:
public void ConfigureServices(IServiceCollection services)
{
    //2.1 services.AddMvc(...)
    services.AddControllersWithViews(options =>
   {
        options.Filters.Add(typeof(MySampleActionFilter));
    });
}

扩展:ASP.NET Core 中的筛选器 asp.net core 3.1

扩展:MVC - 16.MVC过滤器

posted @ 2020-11-19 22:45  【唐】三三  阅读(909)  评论(0编辑  收藏  举报