Что такое метод OnActionExecuted в ASP.NET Core?

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

Ответ

OnActionExecuted — это метод хука в конвейере MVC/WebAPI ASP.NET Core, который вызывается после выполнения метода действия контроллера, но до выполнения результата (Result). Он является частью интерфейса IActionFilter и используется для постобработки, логирования, модификации ответа или обработки исключений.

Типичные сценарии использования:

  • Логирование времени выполнения действия.
  • Добавление или изменение HTTP-заголовков в ответе.
  • Глобальная обработка исключений на уровне фильтра.
  • Модификация объекта ActionResult или данных в ViewData.

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

public class LoggingActionFilter : IActionFilter
{
    private Stopwatch _stopwatch;

    public void OnActionExecuting(ActionExecutingContext context)
    {
        _stopwatch = Stopwatch.StartNew();
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        _stopwatch.Stop();
        var actionName = context.ActionDescriptor.DisplayName;
        var duration = _stopwatch.ElapsedMilliseconds;

        // Логируем завершение действия и его длительность
        Console.WriteLine($"Action '{actionName}' executed in {duration} ms.");

        // Можно проверить, было ли исключение
        if (context.Exception != null && !context.ExceptionHandled)
        {
            // Обработка исключения (например, логирование ошибки)
            Console.WriteLine($"Exception: {context.Exception.Message}");
        }
    }
}

Ключевые моменты:

  • Метод получает ActionExecutedContext, который предоставляет доступ к Result (результат действия), Exception, Controller и другим данным.
  • Фильтр можно зарегистрировать глобально, на уровне контроллера или отдельного действия.
  • Для создания кастомных атрибутов удобнее наследоваться от ActionFilterAttribute, который уже реализует оба метода (OnActionExecuting и OnActionExecuted).