Какие Action фильтры вы знаете в ASP.NET Core?

«Какие Action фильтры вы знаете в ASP.NET Core?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В ASP.NET Core фильтры действий (Action Filters) позволяют выполнять код на разных этапах конвейера обработки запроса. Они реализуют интерфейсы из пространства имен Microsoft.AspNetCore.Mvc.Filters.

Основные типы фильтров:

  1. IActionFilter — выполняется непосредственно до (OnActionExecuting) и после (OnActionExecuted) вызова метода действия. Идеален для логирования, валидации входных данных или изменения аргументов.
  2. IAsyncActionFilter — асинхронная версия IActionFilter.
  3. IResultFilter — выполняется до (OnResultExecuting) и после (OnResultExecuted) выполнения результата действия (например, рендеринга представления). Полезен для модификации HTTP-заголовков или результата.
  4. IExceptionFilter — срабатывает при необработанном исключении в конвейере (OnException). Используется для централизованной обработки ошибок.
  5. IAuthorizationFilter — выполняется самым первым, до всех других фильтров, для проверки прав доступа (OnAuthorization).

Пример кастомного фильтра для логирования:

public class LoggingActionFilter : IActionFilter
{
    private readonly ILogger<LoggingActionFilter> _logger;

    public LoggingActionFilter(ILogger<LoggingActionFilter> logger)
    {
        _logger = logger;
    }

    public void OnActionExecuting(ActionExecutingContext context)
    {
        // Логируем начало выполнения
        _logger.LogInformation("Выполняется действие: {ActionName}", 
            context.ActionDescriptor.DisplayName);
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // Логируем завершение
        _logger.LogInformation("Действие {ActionName} завершено со статусом: {HttpStatusCode}",
            context.ActionDescriptor.DisplayName,
            context.HttpContext.Response.StatusCode);
    }
}

Применение фильтра:

Фильтры можно применять на разных уровнях:

  • На уровне действия:
    [ServiceFilter(typeof(LoggingActionFilter))]
    public IActionResult Get() { ... }
  • На уровне контроллера:
    [ServiceFilter(typeof(LoggingActionFilter))]
    public class HomeController : Controller { ... }
  • Глобально для всех действий: (регистрация в Program.cs)
    builder.Services.AddControllers(options =>
    {
        options.Filters.Add<LoggingActionFilter>();
    });

Встроенные фильтры: ASP.NET Core предоставляет готовые атрибуты, такие как [Authorize], [ValidateAntiForgeryToken], [RequireHttps] и [ResponseCache].