ASP.NET Core MVC中的筛选器使我们可以在请求处理管道的特定阶段之前或之后执行代码。 从授权到结果执行,不同类型的过滤器对应于管道的不同阶段。
例如,您可以利用ASP.NET Core MVC中的动作过滤器在执行动作方法之前和之后执行自定义代码。 本文讨论了ASP.NET Core MVC中的内置筛选器,它们为何有用以及如何在ASP.NET Core应用程序中使用动作筛选器。
ASP.NET Core MVC中的筛选器
ASP.NET Core MVC包含许多内置过滤器。 其中包括:
- ActionFilters。 它们在执行控制器的动作方法之前和之后执行。
- AuthorizationFilters。 这些过滤器在请求管道的开头执行。 它们用于验证用户的凭据,以检查用户是否被授权。
- ResourceFilters。 这些过滤器在授权之后且在模型绑定发生之前执行。 您可以利用ResourceFilters来实现缓存。
- ResultFilters。 这些过滤器用于在执行操作方法的IActionResult之前和之后执行代码。
- ExceptionFilters。 这些过滤器用于处理管道中发生的任何异常。 发生异常时,可以利用ExceptionFilters执行自定义代码。
要使用的过滤器类型的选择取决于您要完成的工作。 例如,如果您试图使请求短路(即,停止执行某个动作方法并过早返回结果),则可以使用资源过滤器。 另外,如果您尝试更改操作方法参数以及从操作方法返回的结果,则可以使用操作过滤器。
ActionFilterAttribute类实现IActionFilter,IAsyncActionFilter,IResultFilter,IAsyncResultFilter和IOrderedFilter接口。 您可以利用此类来实现方法过滤器,控制器过滤器或全局过滤器。 我们将在本文后面对此进行研究。
在Visual Studio 2017中创建ASP.NET Core Web API项目
首先,让我们在Visual Studio中创建一个ASP.NET Core Web API项目。 如果您的系统已启动并运行Visual Studio 2017,请按照以下步骤创建ASP.NET Core MVC项目。
- 启动Visual Studio 2017 IDE。
- 单击文件>新建>项目。
- 从显示的模板列表中选择“ ASP.NET Core Web应用程序(.NET Core)”。
- 指定项目的名称。
- 单击确定保存项目。
- 将显示一个新窗口“ New .NET Core Web Application…”。
- 从顶部的下拉列表中选择.NET Core作为运行时,并选择ASP.NET Core 2.1(或更高版本)。
- 选择“ Web应用程序(模型-视图-控制器)”作为项目模板。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框。 我们不会在这里使用这些功能。
- 确保选择“无身份验证”。 我们也不会在这里使用身份验证。
这将在Visual Studio中创建一个新的ASP.NET Core MVC项目。 在接下来的部分中,我们将使用该项目来实现我们的动作过滤器。
在ASP.NET Core MVC中创建自定义操作筛选器
您可以利用自定义动作过滤器在执行动作方法之前或之后执行可重用的代码。 您可以扩展以下抽象基类以创建自定义过滤器。 请注意,这些抽象类均扩展了Attribute类。
- ActionFilterAttribute
- ResultFilterAttribute
- ExceptionFilterAttribute
- ServiceFilterAttribute
- TypeFilterAttribute
您还可以扩展IActionFilter接口并实现其方法以创建自定义过滤器。 您可以创建同步和异步过滤器。
在ASP.NET Core MVC中创建同步操作筛选器
以下代码段说明了如何通过扩展IActionFilter接口并实现OnActionExecuting和OnActionExecuted方法来创建同步动作过滤器。
public class SimpleActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
//this method will be executed before execution of an action method
}
public void OnActionExecuted(ActionExecutedContext context)
{
//this method will be executed after an action method has executed
}
}
在ASP.NET Core MVC中创建异步操作筛选器
要创建异步操作过滤器,可以扩展IAsyncActionFilter接口并实现OnActionExecutionAsync方法,如下面的代码片段所示。
public class SimpleAsyncActionFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context,
ActionExecutionDelegate next)
{
//code written here will be executed before execution of an action method
await next();
//code written here will be executed after execution of an action method
}
}
在ASP.NET Core的ConfigureServices方法中添加操作筛选器
您可以在范围的不同级别添加过滤器。 这些包括操作范围,控制器范围和全局范围。 以下代码段说明了如何在全局范围内添加过滤器。 请注意,我们上面实现的自定义操作过滤器是如何在Startup类的ConfigureServices方法中添加到过滤器集合的。 请注意,该过滤器是按实例添加到过滤器集合的。
services.AddMvc(options =>
{
options.Filters.Add(new SimpleAsyncActionFilter());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
您还可以按类型添加过滤器,如下面的代码片段所示。
services.AddMvc(options =>
{
options.Filters.Add(typeof (SimpleAsyncActionFilter));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
过滤器使您可以在请求处理管道中的特定点之前或之后执行代码。 ASP.NET Core MVC中的动作筛选器的一项重大新改进之一就是可以在HTTP请求管道中指定筛选器的执行顺序。 我们将在以后的文章中研究ASP.NET Core MVC中的过滤器的这一功能以及更多功能。
From: https://www.infoworld.com/article/3328648/how-to-use-action-filters-in-aspnet-core-mvc.html