Фильтры: action, exception, resource, endpoint filters

↑ 3.3 Web API: контроллеры, Minimal API, валидация · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Часто путают фильтры и middleware. Нужно назвать разницу и порядок выполнения.

Объяснение

Фильтры выполняются внутри MVC/endpoint и знают контекст action, модель и результат.

Тип фильтраКогдаПример
Authorizationсамым первымпроверка политики
Resourceдо/после остального (до binding)кэш ответа
Actionдо/после вызова actionлогирование, валидация
Exceptionнеобработанное исключение actionпреобразование в ответ
Resultдо/после исполнения результатазаголовки
Endpoint filter (Minimal API)вокруг обработчикавалидация, идемпотентность
public class LogActionFilter(ILogger<LogActionFilter> log) : IAsyncActionFilter
{
    public async Task OnActionExecutionAsync(ActionExecutingContext ctx, ActionExecutionDelegate next)
    {
        log.LogInformation("Start {Action}", ctx.ActionDescriptor.DisplayName);
        var executed = await next();
        log.LogInformation("End {Action}", ctx.ActionDescriptor.DisplayName);
    }
}
 
builder.Services.AddControllers(o => o.Filters.Add<LogActionFilter>());
// Minimal API
orders.MapPost("/", handler).AddEndpointFilter(async (ctx, next) =>
{
    var req = ctx.GetArgument<CreateOrderRequest>(0);
    if (req.Quantity <= 0) return Results.BadRequest("quantity");
    return await next(ctx);
});

Порядок: Authorization → Resource → (binding) → Action → выполнение → Result; Exception ловит ошибки action.

Нюансы и подводные камни

  • Фильтры с зависимостями регистрируйте как [ServiceFilter] или [TypeFilter].
  • Exception-фильтр не ловит исключения из middleware; для глобальной обработки — IExceptionHandler.
  • Фильтры действуют только на endpoint-ы MVC; для статических файлов и не-MVC используйте middleware.
  • Слишком много фильтров усложняет понимание порядка (Order).

Практика

  1. Напишите фильтр идемпотентности по заголовку Idempotency-Key.
  2. Сделайте endpoint filter валидации на FluentValidation.
  3. Сравните порядок выполнения на трёх уровнях: middleware → filter → action.

Вопросы с ответами

Связанные темы