在 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:00Action ended at 2024-12-17 12:00:01Total execution time: 00:00:01
总结:
IAsyncActionFilter用于处理异步操作,并允许你在控制器动作方法执行前后插入异步逻辑。 它实现了 OnActionExecutionAsync
方法,在执行控制器方法时可以执行异步代码。你可以通过 [ServiceFilter]
或Add
方法将其应用到控制器或方法,并使用依赖注入来注册自定义过滤器。
这样,你可以在处理异步操作(如数据库查询、调用外部 API 等)时,确保过滤器的行为不会阻塞主线程,并且能有效地进行异步处理。
文章转载自跟着阿笨一起玩NET,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




