ASP.NET Core中的筛选器允许代码在请求处理管道中的特定阶段之前或之后运行。
可以创建自定义过滤器来处理横切关注点。横切关注点的示例包括错误处理,缓存,配置,授权和日志记录。过滤器避免重复代码。例如,错误处理异常过滤器可以合并错误处理。.
过滤器如何工作

过滤器类型
1、授权过滤器
是第一个过滤器在过滤器管道中运行。
控制对操作方法的访问。
有一个前方法,但没有后方法。
2、资源过滤器
实现IResourceFilter或IAsyncResourceFilter接口。
执行将包装大多数过滤器管道。
仅授权过滤器在资源过滤器之前运行。
3、动作过滤器
实现IActionFilter或IAsyncActionFilter接口。
它们的执行围绕动作方法的执行。
public class MySampleActionFilter : IActionFilter{public void OnActionExecuting(ActionExecutingContext context){// Do something before the action executes.MyDebug.Write(MethodBase.GetCurrentMethod(), context.HttpContext.Request.Path);}public void OnActionExecuted(ActionExecutedContext context){// Do something after the action executes.MyDebug.Write(MethodBase.GetCurrentMethod(), context.HttpContext.Request.Path);}}
4、异常过滤器
实现IExceptionFilter或IAsyncExceptionFilter。
可用于实施常见的错误处理策略。
public class CustomExceptionFilter : IExceptionFilter{private readonly IWebHostEnvironment _hostingEnvironment;private readonly IModelMetadataProvider _modelMetadataProvider;public CustomExceptionFilter(IWebHostEnvironment hostingEnvironment,IModelMetadataProvider modelMetadataProvider){_hostingEnvironment = hostingEnvironment;_modelMetadataProvider = modelMetadataProvider;}public void OnException(ExceptionContext context){if (!_hostingEnvironment.IsDevelopment()){return;}var result = new ViewResult {ViewName = "CustomError"};result.ViewData = new ViewDataDictionary(_modelMetadataProvider,context.ModelState);result.ViewData.Add("Exception", context.Exception);// TODO: Pass additional detailed data via ViewDatacontext.Result = result;}}
5、结果过滤器
实现一个接口:
IResultFilter或IAsyncResultFilter
IAlwaysRunResultFilter或IAsyncAlwaysRunResultFilter
它们的执行围绕动作结果的执行。
public class AddHeaderResultServiceFilter : IResultFilter{private ILogger _logger;public AddHeaderResultServiceFilter(ILoggerFactory loggerFactory){_logger = loggerFactory.CreateLogger<AddHeaderResultServiceFilter>();}public void OnResultExecuting(ResultExecutingContext context){var headerName = "OnResultExecuting";context.HttpContext.Response.Headers.Add(headerName, new string[] { "ResultExecutingSuccessfully" });_logger.LogInformation("Header added: {HeaderName}", headerName);}public void OnResultExecuted(ResultExecutedContext context){// Can't add to headers here because response has started._logger.LogInformation("AddHeaderResultServiceFilter.OnResultExecuted");}}
