Фильтры: action, exception, resource, endpoint filters
↑ 3.3 Web API: контроллеры, Minimal API, валидация · ← Предыдущая · → Следующая
Зачем это на собесе
Часто путают фильтры и 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).
Практика
- Напишите фильтр идемпотентности по заголовку
Idempotency-Key. - Сделайте endpoint filter валидации на FluentValidation.
- Сравните порядок выполнения на трёх уровнях: middleware → filter → action.
Вопросы с ответами
Чем фильтр отличается от middleware?
Middleware работает на уровне HTTP для любого запроса; фильтр — внутри MVC/endpoint и видит action, модель и результат.
Какие типы фильтров есть?
Authorization, Resource, Action, Exception, Result; в Minimal API — endpoint filters.
Где лучше централизовать обработку ошибок?
В
IExceptionHandler/middleware, а не в exception-фильтрах: они не покрывают всё.