ASP.NET Core中有哪些过滤器,他们的作用和顺序是怎样的?
在 ASP.NET Core 中,过滤器(Filters)提供了在控制器操作方法的执行前后插入自定义逻辑的方式。过滤器主要用于处理横切关注点,如日志记录、身份验证、错误处理、缓存等。它们按特定的顺序执行,且可以应用于全局、控制器或操作方法级别。
ASP.NET Core 过滤器的类型
ASP.NET Core 过滤器根据其执行时机和作用分为以下几类:
授权过滤器 (Authorization Filters)
作用:用于进行身份验证和授权,判断用户是否有权访问某个控制器或操作方法。
执行时机:这是第一个执行的过滤器,在资源初始化、模型绑定等其他处理之前执行。如果授权失败,请求会被拦截,不会继续执行。
示例:
[Authorize]
:用于控制访问权限。[AllowAnonymous]
:允许匿名访问,跳过[Authorize]
。
[Authorize] public class AdminController : Controller { public IActionResult Index() => View(); }
资源过滤器 (Resource Filters)
作用:在模型绑定之前执行,主要用于资源管理、缓存控制等。可以在这里处理类似于请求预处理或终止请求的操作。
执行时机:在授权之后,模型绑定之前执行。
应用场景:缓存控制、提前拦截不必要的请求。
public class CustomResourceFilter : IResourceFilter { public void OnResourceExecuting(ResourceExecutingContext context) { // 在操作方法执行之前执行逻辑 } public void OnResourceExecuted(ResourceExecutedContext context) { // 在操作方法执行之后执行逻辑 } }
操作过滤器 (Action Filters)
作用:在控制器操作方法调用的前后执行,用于对操作方法的输入或输出进行处理。可以用于日志记录、输入验证等。
执行时机:模型绑定之后,操作方法执行之前/之后。
应用场景:记录日志、参数校验。
接口:
IActionFilter
:同步过滤器。IAsyncActionFilter
:异步过滤器。
public class CustomResourceFilter : IResourceFilter { public void OnResourceExecuting(ResourceExecutingContext context) { // 在操作方法执行之前执行逻辑 } public void OnResourceExecuted(ResourceExecutedContext context) { // 在操作方法执行之后执行逻辑 } }
异常过滤器 (Exception Filters)
作用:捕获控制器操作方法或其他过滤器中抛出的未处理异常。异常过滤器可以用于统一的异常处理逻辑,例如记录错误日志或返回特定的错误响应。
执行时机:在操作方法或结果执行期间如果发生异常则会触发。
应用场景:全局异常处理。
public class CustomExceptionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { // 捕获异常并处理 context.Result = new ContentResult { Content = "An error occurred." }; context.ExceptionHandled = true; } }
结果过滤器 (Result Filters)
作用:在操作方法执行之后、返回结果之前或之后执行。结果过滤器主要用于在生成和发送响应之前进行处理。
执行时机:在操作方法返回
IActionResult
后,响应结果生成之前/之后。应用场景:修改响应、记录响应日志。
接口:
IResultFilter
:同步过滤器。IAsyncResultFilter
:异步过滤器。
public class CustomResultFilter : IResultFilter { public void OnResultExecuting(ResultExecutingContext context) { // 在结果生成之前执行逻辑 } public void OnResultExecuted(ResultExecutedContext context) { // 在结果生成之后执行逻辑 } }
过滤器执行的顺序
ASP.NET Core 过滤器执行顺序依赖于它们的类型和它们在管道中的顺序。过滤器按以下顺序执行:
授权过滤器 (Authorization Filters):最早执行,处理身份验证和授权逻辑。授权失败时,后续的过滤器和操作方法将不会被执行。
资源过滤器 (Resource Filters):在授权过滤器之后、模型绑定之前执行。资源过滤器可以对请求进行预处理,或者决定是否继续处理请求。
操作过滤器 (Action Filters):
OnActionExecuting:在操作方法调用之前执行。
OnActionExecuted:在操作方法执行完毕之后执行。
异常过滤器 (Exception Filters):如果操作方法或其他过滤器抛出未处理的异常,异常过滤器会被触发,捕获并处理异常。
结果过滤器 (Result Filters):
OnResultExecuting:在返回
IActionResult
结果之前执行。OnResultExecuted:在结果生成并发送响应之后执行。
过滤器的应用方式
全局应用:过滤器可以通过在
Startup.cs
文件中的ConfigureServices
方法中配置全局添加。public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(options => { options.Filters.Add(new CustomActionFilter()); }); }
控制器级别应用:过滤器可以应用在具体的控制器类上,这样它只对该控制器中的所有操作方法生效。
[ServiceFilter(typeof(CustomActionFilter))] public class HomeController : Controller { public IActionResult Index() { return View(); } }
操作方法级别应用:过滤器也可以应用在单个操作方法上,只影响该方法。
public class HomeController : Controller { [ServiceFilter(typeof(CustomActionFilter))] public IActionResult About() { return View(); } }
总结
ASP.NET Core 过滤器允许开发者在控制器和操作方法执行的不同阶段插入自定义逻辑。它们按照特定的顺序执行,处理不同的应用场景,从授权、资源管理、操作处理到结果生成和异常处理。开发者可以根据实际需求,在全局、控制器或方法级别应用这些过滤器,从而增强应用的灵活性和可维护性。