ASP.NET Core的ActionFilterAttribute
包含以下内容:
public virtual void OnActionExecuting(ActionExecutingContext context);
public virtual void OnActionExecuted(ActionExecutedContext context);
public virtual Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next);
我需要一个OnActionExecuting
的异步版本,它不存在。
但我觉得我可以使用OnActionExecutionAsync
,因为它也有ActionExecutingContext
的参数。
我是否更正,尽管有名称,但它们会在过程中的同一点触发?
另外,我需要对next
参数做些什么?一旦我完成了我的工作,我只需要拨打await next()
吗?
答案 0 :(得分:34)
异步过滤器的工作方式略有不同:首先执行必须在操作之前执行的代码,为实际逻辑调用next()
,最后添加要在操作之后执行的代码。
public async Task OnActionExecutionAsync(ActionExecutingContext context,
ActionExecutionDelegate next)
{
// logic before action goes here
await next(); // the actual action
// logic after the action goes here
}
文档在这里:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters#implementation
答案 1 :(得分:0)
异步过滤器始终优先于同步过滤器实现。
根据Docs:
但是,您可以同时拥有两者。例如:
public class TimestampFilter : IActionFilter, IAsyncActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
context.ActionDescriptor.RouteValues["timestamp"] = DateTime.Now.ToString();
}
public void OnActionExecuted(ActionExecutedContext context)
{
var ts = DateTime.Parse(context.ActionDescriptor. RouteValues["timestamp"]).AddHours(1).ToString();
context.HttpContext.Response.Headers["X-EXPIRY-TIMESTAMP"] = ts;
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
this.OnActionExecuting(context);
var resultContext = await next();
this.OnActionExecuted(resultContext);
}
}
答案 2 :(得分:0)
一个更好的模式:
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
try
{
//do your async things here
}
finally
{
await base.OnActionExecutionAsync(context, next); <--- notice this!
}
}