ASP.NET Core 中如何使用异步过滤器Filter

在 ASP.NET Core 中,IAsyncActionFilter 是一个异步版本的过滤器接口,它允许你在控制器动作方法执行之前或之后执行异步操作。与同步的 ActionFilterAttribute 不同,IAsyncActionFilter 可以执行异步代码,因此适合用于处理需要异步操作的场景,例如数据库查询、API 调用或 I/O 操作。

如何使用 IAsyncActionFilter
IAsyncActionFilter 需要实现 OnActionExecutionAsync 方法,这是一个异步方法。你可以在这个方法中编写异步逻辑,并通过调用 next() 方法来继续请求管道的执行。

步骤:
实现 IAsyncActionFilter 接口:

你需要创建一个类,继承 IAsyncActionFilter 接口,并实现 OnActionExecutionAsync 方法。
在控制器或方法中使用过滤器:

可以通过 Add 方法将自定义的过滤器添加到控制器或特定的方法上。
示例代码:
1. 创建一个自定义的 IAsyncActionFilter
首先,创建一个类实现 IAsyncActionFilter 接口。假设我们想记录操作的执行时间,并异步处理一些逻辑。

using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Threading.Tasks;
public class LogExecutionTimeAsyncFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
// 在执行 Action 方法之前记录时间
var startTime = DateTime.Now;
Console.WriteLine($"Action started at {startTime}");
// 调用下一个过滤器/操作(这会执行控制器方法)
var resultContext = await next();
// 在 Action 方法执行之后记录时间
var endTime = DateTime.Now;
Console.WriteLine($"Action ended at {endTime}");
Console.WriteLine($"Total execution time: {endTime - startTime}");
}
}
你可以将自定义的异步过滤器应用到控制器或特定的方法上。

应用到整个控制器
[ServiceFilter(typeof(LogExecutionTimeAsyncFilter))] // 将过滤器应用到控制器
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}

应用到特定的操作方法
public class HomeController : Controller
{
[ServiceFilter(typeof(LogExecutionTimeAsyncFilter))] // 只应用到 Index 方法
public IActionResult Index()
{
return View();
}
}
3. 在 Startup.cs 中注册过滤器
确保在 Startup.cs 或 Program.cs 文件中注册你的过滤器。如果你使用依赖注入(DI)来注入过滤器,你需要将过滤器注册为服务。 文件中注册你的过滤器。如果你使用依赖注入(DI)来注入过滤器,你需要将过滤器注册为服务。
public void ConfigureServices(IServiceCollection services)
{
// 注册自定义的过滤器
services.AddScoped<LogExecutionTimeAsyncFilter>();

// 注册 MVC 服务
services.AddControllersWithViews(options =>
{
options.Filters.AddService<LogExecutionTimeAsyncFilter>();
});
}
4. 异步执行
通过这种方式,当你访问 HomeController.Index 动作时,过滤器将会记录操作的执行时间,并且由于使用了异步方法 OnActionExecutionAsync,它可以执行异步操作(例如异步日志记录、数据库访问等)。

结果:
假设你访问了控制器的 Index 方法,控制台日志可能会显示类似的内容:

Action started at 2024-12-17 12:00:00
Action ended at 2024-12-17 12:00:01
Total execution time: 00:00:01
总结:
IAsyncActionFilter
用于处理异步操作,并允许你在控制器动作方法执行前后插入异步逻辑。
它实现了 OnActionExecutionAsync 方法,在执行控制器方法时可以执行异步代码。
你可以通过 [ServiceFilter] 或 Add 方法将其应用到控制器或方法,并使用依赖注入来注册自定义过滤器。
这样,你可以在处理异步操作(如数据库查询、调用外部 API 等)时,确保过滤器的行为不会阻塞主线程,并且能有效地进行异步处理。

 

posted @   跟着阿笨一起玩.NET  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2021-02-04 SQL Server数据库高级进阶之事务实战演练
2021-02-04 C#如何正确运用异步编程技术
2021-02-04 SQL Server数据库高级进阶之锁实战演练
2020-02-04 .NET Core基于SQL Server数据库主从同步实现读写分离实战演练
2013-02-04 将要被社会淘汰的8种人
点击右上角即可分享
微信分享提示