← Назад к вопросам

Что такое фильтры в ASP.NET?

2.3 Middle🔥 191 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Фильтры в ASP.NET Core: концепция, типы и применение

Фильтры (Filters) в ASP.NET Core представляют собой мощный механизм для внедрения дополнительной логики в pipeline обработки HTTP-запросов. Это специальные классы, которые выполняются перед, после или во время выполнения действий контроллера или методов Razor Pages. Они позволяют реализовать такие функции, как авторизация, обработка исключений, логирование, кеширование и валидация, не смешивая этот код непосредственно с бизнес-логикой контроллеров.

Типы фильтров и их роль в pipeline

ASP.NET Core поддерживает пять основных типов фильтров, которые выполняются в строгом порядке:

  • Фильтры авторизации (Authorization Filters) — выполняются первыми и определяют, имеет пользователь право на доступ к ресурсу. Если фильтр авторизации запрещает доступ, весь pipeline прерывается.

    public class CustomAuthFilter : IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            if (!context.HttpContext.User.Identity.IsAuthenticated)
            {
                context.Result = new UnauthorizedResult();
            }
        }
    }
    
  • Фильтры ресурсов (Resource Filters) — выполняются сразу после фильтров авторизации и перед входом в основную pipeline. Часто используются для кеширования (если ответ уже есть в кеше, дальнейшая обработка прекращается) или для логирования времени выполнения.

    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Проверить кеш перед выполнением действия
        }
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Записать результат в кеш после выполнения
        }
    }
    
  • Фильтры действий (Action Filters) — выполняются непосредственно перед и после выполнения метода контроллера. Это наиболее часто используемый тип, идеальный для валидации модели, модификации аргументов или результата.

    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Логировать начало выполнения действия
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Логировать завершение выполнения действия
        }
    }
    
  • Фильтры исключений (Exception Filters) — обрабатывают исключения, возникшие в процессе выполнения действия, контроллера или других фильтров. Позволяют централизованно управлять ошибками.

    public class GlobalExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Логировать исключение и возвращать стандартизированный ответ
            context.Result = new ObjectResult(new { error = "Internal error" })
            {
                StatusCode = 500
            };
            context.ExceptionHandled = true;
        }
    }
    
  • Фильтры результатов (Result Filters) — выполняются перед и после генерации конечного результата действия (например, перед рендерингом представления или сериализацией JSON). Полезны для модификации окончательного ответа.

    public class CompressResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Подготовить контекст для компрессии
        }
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Применить компрессию к ответу
        }
    }
    

Реализация и применение фильтров

Фильтры можно применять на нескольких уровнях:

  • Глобально — регистрируются в Startup.cs или Program.cs и применяются ко всем действиям.

    // В Program.cs (.NET 6+)
    builder.Services.AddControllers(options =>
    {
        options.Filters.Add(new GlobalExceptionFilter());
    });
    
  • На уровне контроллера — применяются ко всем действиям конкретного контроллера через атрибут.

    [ServiceFilter(typeof(LogActionFilter))]
    public class HomeController : Controller
    {
        // Все методы будут обернуты фильтром LogActionFilter
    }
    
  • На уровне метода действия — применяются только к конкретному методу, обеспечивая максимальную гибкость.

    [TypeFilter(typeof(CacheResourceFilter))]
    public IActionResult GetProduct(int id)
    {
        // Метод будет обернут фильтром кеширования
    }
    

Также существуют удобные атрибуты-фильтры, такие как [Authorize], [ValidateAntiForgeryToken], [RequireHttps], которые являются готовыми реализациями соответствующих фильтров.

Синхронные и асинхронные варианты

Для каждого типа фильтра существует синхронный интерфейс (например, IActionFilter) и асинхронный интерфейс (например, IAsyncActionFilter). Асинхронные интерфейсы имеют один метод OnActionExecutionAsync вместо двух отдельных методов OnActionExecuting и OnActionExecuted, что удобно для задач, связанных с асинхронными операциями.

Практические сценарии использования

Фильтры незаменимы в реальных проектах для:

  • Централизованной авторизации и проверки ролей — вместо повторения проверок в каждом методе.
  • Валидации входных данных — проверка моделей перед передачей в бизнес-логику.
  • Логирования и мониторинга — автоматическое логирование всех запросов, их времени выполнения и ошибок.
  • Кеширования ответов — уменьшение нагрузки на сервер для часто запрашиваемых данных.
  • Обработки исключений — формирование единого формата ответов при ошибках для клиента.
  • Модификации заголовков ответов — добавление стандартных заголовков безопасности или производительности.

Заключение

Фильтры являются фундаментальным компонентом архитектуры ASP.NET Core, обеспечивающим разделение ответственности (Separation of Concerns) и соблюдение принципа сквозной функциональности (Cross-Cutting Concerns). Они позволяют разработчикам отделить инфраструктурный код от бизнес-логики, делая приложение более чистым, поддерживаемым и масштабируемым. Понимание порядка выполнения фильтров и их типов критически важно для построения надежных и эффективных веб-API и приложений.

Что такое фильтры в ASP.NET? | PrepBro