.Net核心操作筛选器将应用于所有忽略装饰器的控制器

时间:2020-03-17 12:57:19

标签: c# asp.net-core .net-core action-filter asp.net-core-3.1

我已经定义了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之前和之后被调用。

有什么想法我在这里做错了吗?

1 个答案:

答案 0 :(得分:2)

将过滤器添加到启动时,它会根据the docs

全局应用

如果您只希望将其应用于操作,则应该将其从启动中删除,并将属性保留在操作上。

从启动中删除此行应该可以解决问题:

opts.Filters.Add(new CustomActionFilter());
相关问题