ASP.NET Core中的筛选器

ASP.NET Core中的筛选器允许代码在请求处理管道中的特定阶段之前或之后运行。

可以创建自定义过滤器来处理横切关注点。横切关注点的示例包括错误处理,缓存,配置,授权和日志记录。过滤器避免重复代码。例如,错误处理异常过滤器可以合并错误处理。.

过滤器如何工作

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 ViewData        context.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");    }}