Ответ
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).