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