我已经定义了IAsyncActionFilter
(Microsoft Action Filter),如下所示:
public class CustomActionFilter : IAsyncActionFilter
{
public CustomActionFilter()
{
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
// do something
}
}
我在startup
的{{1}}下添加了它的声明:
ConfigureServices
在services.AddScoped<CustomActionFilter>();
的末尾,我将其配置为ConfigureServices
:
Filter
最后,对于特定的调用,我在控制器中使用了一个装饰器,以表明我希望该过滤器应用于该调用:
services.AddMvc((opts) =>
{
opts.EnableEndpointRouting = false;
opts.Filters.Add(new CustomActionFilter());
});
到目前为止,一切正常,并且在制作[ApiController]
[Route("a")]
public class AController : Controller
{
public AController()
{
}
[HttpGet("aa")]
[ServiceFilter(typeof(CustomActionFilter))]
public async Task<IActionResult> DoubleA()
{
// do something after the filter is called
}
}
控制器之前和之后都在调用CustomActionFilter
。
问题是 ALL 控制器和路由正在使用此DoubleA
,而与装饰器无关。
例如在此控制器中:
CustomActionFilter
[ApiController]
[Route("b")]
public class BController : Controller
{
public BController()
{
}
[HttpGet("bb")]
public async Task<IActionResult> DoubleB()
{
// do something without any kind of Filter inervention
}
}
也在CustomActionFilter
之前和之后被调用。
有什么想法我在这里做错了吗?
答案 0 :(得分:2)
将过滤器添加到启动时,它会根据the docs
全局应用如果您只希望将其应用于操作,则应该将其从启动中删除,并将属性保留在操作上。
从启动中删除此行应该可以解决问题:
opts.Filters.Add(new CustomActionFilter());