Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Метод OnActionExecuted в ASP.NET Core
OnActionExecuted — это ключевой метод интерфейса IActionFilter в ASP.NET Core, который позволяет выполнять код после завершения выполнения метода действия (Action Method) контроллера, но до отправки результата клиенту. Он является частью механизма фильтров (Filters), который предоставляет мощный способ для внедрения логики обработки запросов и ответов на уровне контроллера или действия.
Место в жизненном цикле запроса ASP.NET Core
Фильтры действий выполняются в рамках Pipeline MVC после middleware. Порядок выполнения для IActionFilter:
OnActionExecuting— перед вызовом метода действия.- Выполнение метода действия контроллера.
OnActionExecuted— после метода действия, но до финальной обработки результата (IResultFilter).
public interface IActionFilter
{
void OnActionExecuting(ActionExecutingContext context);
void OnActionExecuted(ActionExecutedContext context);
}
Практическое использование
Основные сценарии применения OnActionExecuted:
- Логирование и аудит — запись информации о выполнении действия, времени обработки, результатах.
- Обработка исключений — анализ и дополнительная обработка ошибок, возникших в методе действия.
- Модификация результата — изменение данных в
ActionResultперед отправкой клиенту. - Валидация ответов — проверка соответствия выходных данных определенным стандартам или правилам.
- Измерение производительности — расчет времени выполнения действия для мониторинга.
Пример реализации собственного фильтра
public class LoggingActionFilter : IActionFilter
{
private readonly ILogger<LoggingActionFilter> _logger;
public LoggingActionFilter(ILogger<LoggingActionFilter> logger)
{
_logger = logger;
}
public void OnActionExecuting(ActionExecutingContext context)
{
_logger.LogInformation("Начало выполнения действия: {Action}", context.ActionDescriptor.DisplayName);
}
public void OnActionExecuted(ActionExecutedContext context)
{
var actionName = context.ActionDescriptor.DisplayName;
if (context.Exception != null)
{
_logger.LogError(context.Exception, "Ошибка при выполнении действия: {Action}", actionName);
}
else
{
_logger.LogInformation("Успешное завершение действия: {Action}", actionName);
}
}
}
Регистрация фильтра в приложении
Фильтры можно применять на разных уровнях:
Глобально (для всех контроллеров и действий):
// В Startup.cs или Program.cs
builder.Services.AddControllers(options =>
{
options.Filters.Add<LoggingActionFilter>();
});
На уровне контроллера:
[TypeFilter(typeof(LoggingActionFilter))]
public class ProductsController : ControllerBase
{
// ...
}
На уровне действия:
[ServiceFilter(typeof(LoggingActionFilter))]
public IActionResult GetProduct(int id)
{
// ...
}
Особенности ActionExecutedContext
Контекст ActionExecutedContext, передаваемый в метод, содержит важные свойства для анализа результата выполнения:
Exception— исключение, если оно возникло в методе действия.ExceptionHandled— флаг, указывающий, было ли исключение уже обработано.Result— объектIActionResult, который будет преобразован в ответ клиенту.Controller— ссылка на экземпляр контроллера.ActionDescriptor— метаинформация о выполняемом действии.
Отличие от других фильтров
Важно понимать различия между типами фильтров:
IActionFilter(OnActionExecuting/OnActionExecuted) — работает с методом действия.IResultFilter(OnResultExecuting/OnResultExecuted) — работает с результатом действия после его формирования.IAsyncActionFilter— асинхронная версияIActionFilterс методомOnActionExecutionAsync.
Асинхронная альтернатива
Для современных приложений рекомендуется использовать асинхронные фильтры:
public class AsyncLoggingFilter : IAsyncActionFilter
{
public async Task OnActionExecutionAsync(
ActionExecutingContext context,
ActionExecutionDelegate next)
{
// Логирование перед выполнением действия
var actionName = context.ActionDescriptor.DisplayName;
Console.WriteLine($"Before: {actionName}");
// Выполнение метода действия и получение результата
var executedContext = await next();
// Логирование после выполнения действия
if (executedContext.Exception != null)
{
Console.WriteLine($"Exception in {actionName}: {executedContext.Exception.Message}");
}
else
{
Console.WriteLine($"After: {actionName} completed successfully");
}
}
}
OnActionExecuted является мощным инструментом для реализации кросс-функциональных требований (cross-cutting concerns) без дублирования кода в каждом методе контроллера. Он позволяет централизованно управлять логикой, связанной с пост-обработкой действий, соблюдая принципы чистой архитектуры и разделения ответственности в ASP.NET Core приложениях.