Ответ
В ASP.NET Core фильтры действий (Action Filters) позволяют выполнять код на разных этапах конвейера обработки запроса. Они реализуют интерфейсы из пространства имен Microsoft.AspNetCore.Mvc.Filters.
Основные типы фильтров:
- IActionFilter — выполняется непосредственно до (
OnActionExecuting) и после (OnActionExecuted) вызова метода действия. Идеален для логирования, валидации входных данных или изменения аргументов. - IAsyncActionFilter — асинхронная версия
IActionFilter. - IResultFilter — выполняется до (
OnResultExecuting) и после (OnResultExecuted) выполнения результата действия (например, рендеринга представления). Полезен для модификации HTTP-заголовков или результата. - IExceptionFilter — срабатывает при необработанном исключении в конвейере (
OnException). Используется для централизованной обработки ошибок. - 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].