一.筛选器的定义
筛选器(filter,也可以翻译为“过滤器”)是 ASP.NET Core 中提供的一种切面编程机制,它允许开发人员创建自定义筛选器来处理横切关注点,也就是在ASP.NET Core 特定的位置执行我们自定义的代码,比如在控制器的操作方法之前执行数据检查的代码,或者在ActionResult执行的时候向响应报文头中写入自定义数据等。
ASP.NETCore 中的筛选器有以下5种类型:授权筛选器、资源筛选器、操作筛选器、异常筛选器和结果筛选器。在进行项目开发的时候,我们一般配置授权策略或编写自定义授权策略,而不是编写自定义授权筛选器,只有在需要自定义授权框架时才会用到自定义授权筛选器。类似的道理也适用于资源筛选器和结果筛选器,因此本节重点讲解异常筛选器和操作筛选器。
所有筛选器一般有同步和异步两个版本,比如同步操作筛选器实现IActionFilter 接口,而异步操作筛选器实现IAsyncActionFilter 接口。在大部分场景下,异步筛选器的性能更好,而且可以支持在实现类中编写异步调用的代码。
二. 筛选器的执行顺序
三.实现
public class MyExceptionFilter : IAsyncExceptionFilter
{
private readonly ILogger<MyExceptionFilter> logger;
private readonly IHostEnvironment env;
public MyExceptionFilter(ILogger<MyExceptionFilter> logger, IHostEnvironment env)
{
this.logger = logger;
this.env= env;
}
public Task OnExceptionAsync(ExceptionContext context)
{
Exception exception = context.Exception;
logger.LogError(exception,"UnhandledException occured");
string message;
if(env.IsDevelopment())
mespage =exception.tostring();
else
message="程序你出现来处理异常";
objeckResult result = new ObjectResult (nesw(code=500,massage =message });
result.statusCode = 500;
content Result = result;
centent Excoptionlandled =true;
return Task.CompletedTask;
}}
异步异常筛选器要实现 IAsyncExceptionFilter 接口。由于筛选器中需要把异常信息记录到88中井且判断程字的执行环境,因此筛选器需要注入ILogger 和 IHostEnvircament 这两个服务。第12 行代码中,我们使用 context.Exception 获取异常对象,然后在第 13 行代码中,把异常写入志,在第14~18 行代码中,我们检测程序的运行环境来决定 message 的值中是否显示异常堆栈提显然,在生产环境中,我们不能显示异常堆栈,以避免泄露程序的机密信息。在第 19~21行代码中,我们设置响应报文的内容。在第22行代码中,我们设置 contextExceptionHandled 的值为 true.通过这样的方式来告知 ASPNET Core 不再执行默认的异常响应逻辑。
然后,我们在 Program.cs 的 builder Build 之前添加代码 ,设置全局的筛选器。
builder.Services.Configure<MycOptions>(options =>
{
options filters .Add<MyExceptionfiiter>();
});