. Net core Action Filter применяется ко всем контроллерам, игнорируя декораторы - PullRequest
0 голосов
/ 17 марта 2020

Я определил IAsyncActionFilter (Microsoft Фильтр действий ) следующим образом:

public class CustomActionFilter : IAsyncActionFilter
{

    public CustomActionFilter()
    {
    }

    public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // do something
    }
}

Я добавил его объявление под startup в ConfigureServices:

services.AddScoped<CustomActionFilter>();

И в конце ConfigureServices я настраиваю его как Filter:

services.AddMvc((opts) =>
{
    opts.EnableEndpointRouting = false;
    opts.Filters.Add(new CustomActionFilter());
});

Наконец, я использую декоратор в контроллере, для уточнения c вызов, чтобы указать, что я хочу, чтобы этот фильтр применялся в этом вызове:

[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 вызывается до и после выполнения контроллера DoubleA .

Проблема в том, что ALL контроллеры и маршруты используют это 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 также вызывается до и после DoubleB.

Есть идеи, что я здесь не так делаю?

1 Ответ

2 голосов
/ 17 марта 2020

Когда вы добавляете фильтр к вашему запуску, он применяется глобально согласно документам

Если вы хотите, чтобы он применялся только к вашему действию, следует удалить его из запуска и оставить Атрибут в действии должен работать.

Удалить эту строку из автозагрузки нужно, чтобы добиться цели:

opts.Filters.Add(new CustomActionFilter());
...