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