Sobes.tech
Middle
133
questionbank

Что такое Action фильтр и какие функции он выполняет?

Ответ от нейросети

sobes.tech AI

Action-фильтры в ASP.NET Core — это специфический тип фильтров, который перехватывает выполнение метода действия контроллера.

Основные функции:

  • Перед выполнением действия: Выполняют код до того, как будет вызван метод действия контроллера (OnActionExecuting).
  • После выполнения действия: Выполняют код после того, как метод действия контроллера был вызван, но до того, как будет выполнено форматирование результата (OnActionExecuted).
  • Модификация контекста: Могут изменять контекст выполнения действия (ActionExecutingContext) или контекст после выполнения (ActionExecutedContext), например, добавлять данные в HttpContext.Items, изменять маршрутизацию или устанавливать результат действия.
  • Обработка исключений: Не напрямую обрабатывают исключения, но могут быть использованы для установки результата ошибки, если исключение произошло на стадии OnActionExecuting.

Примеры использования:

  • Валидация данных запроса перед вызовом действия.
  • Добавление заголовков или модификация тела ответа.
  • Логирование информации о запросе и ответе.
  • Кэширование результатов действия.
  • Выполнение авторизации и аутентификации (хотя для этого чаще используются специализированные Authorization и Authentication фильтры).

Реализация: Создаются путём наследования от ActionFilterAttribute или реализации интерфейсов IActionFilter (синхронный) или IAsyncActionFilter (асинхронный).

// Пример простого синхронного Action-фильтра
public class CustomActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        // Логика перед выполнением действия
        Console.WriteLine("Before action execution");
        base.OnActionExecuting(context);
    }

    public override void OnActionExecuted(ActionExecutedContext context)
    {
        // Логика после выполнения действия
        if (context.Exception == null && context.Result is ObjectResult objectResult)
        {
            // Модификация результата, если нет исключения и результат ObjectResult
            Console.WriteLine($"Action result status code: {objectResult.StatusCode}");
        }
        Console.WriteLine("After action execution");
        base.OnActionExecuted(context);
    }
}

Применяются к контроллерам или отдельным методам действий с помощью атрибутов:

[CustomActionFilter] // Применение к контроллеру
public class HomeController : Controller
{
    [HttpGet]
    [CustomActionFilter] // Применение к методу действия
    public IActionResult Index()
    {
        return Ok("Hello from Index!");
    }
}