在上一篇里,介绍了中间件的相关内容和使用方法。本篇将介绍Asp.Net Core MVC框架的过滤器的相关内容和使用方法,并简单说明一下与中间件的区别。
下图展示了Asp.Net Core MVC框架默认实现的过滤器的执行顺序:
Authorization Filters:身份验证过滤器,处在整个过滤器通道的最顶层。对应的类型为: AuthorizeAttribute.cs
Resource Filters:资源过滤器。因为所有的请求和响应都将经过这个过滤器,所以在这一层可以实现类似缓存的功能。对应的接口有同步和异步两个版本: IResourceFilter.cs 、 IAsyncResourceFilter.cs
Action Filters:方法过滤器。在控制器的Action方法执行之前和之后被调用,一个很常用的过滤器。对应的接口有同步和异步两个版本: IActionFilter.cs 、 IAsyncActionFilter.cs
Exception Filters:异常过滤器。当Action方法执行过程中出现了未处理的异常,将会进入这个过滤器进行统一处理,也是一个很常用的过滤器。对应的接口有同步和异步两个版本: IExceptionFilter.cs 、 IAsyncExceptionFilter.cs
Result Filters:返回值过滤器。当Action方法执行完成的结果在组装或者序列化前后被调用。对应的接口有同步和异步两个版本: IResultFilter.cs 、 IAsyncResultFilter.cs
下面通过代码示例来演示上面图示里的流程顺序:
1. 在工程里分别添加如下几个过滤器
1 using System; 2 using Microsoft.AspNetCore.Mvc.Filters; 3 using Microsoft.Extensions.Logging; 4 5 namespace WebApiFrame.Core.Filters 6 { 7 public class SimpleResourceFilterAttribute : Attribute, IResourceFilter 8 { 9 private readonly ILogger<SimpleResourceFilterAttribute> logger; 10 11 public SimpleResourceFilterAttribute(ILoggerFactory loggerFactory) 12 { 13 logger = loggerFactory.CreateLogger<SimpleResourceFilterAttribute>(); 14 } 15 16 public void OnResourceExecuted(ResourceExecutedContext context) 17 { 18 logger.LogInformation("ResourceFilter Executed!"); 19 } 20 21 public void OnResourceExecuting(ResourceExecutingContext context) 22 { 23 logger.LogInformation("ResourceFilter Executing!"); 24 } 25 } 26 }