ASP.NET Core中的筛选器

一.筛选器的定义

筛选器(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>();

});

猜你喜欢

转载自blog.csdn.net/qq_71012549/article/details/128650047