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

В чем разница между middleware и фильтром?

1.7 Middle🔥 111 комментариев
#ASP.NET и Web API

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

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

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

Middleware vs Фильтры в ASP.NET Core: Сравнение архитектурных компонентов

Основное предназначение и расположение в конвейере

Middleware и фильтры — это два фундаментальных механизма ASP.NET Core для обработки HTTP-запросов, но они работают на разных уровнях архитектурного стека.

Middleware — это компоненты, которые образуют конвейер обработки запросов на самом нижнем уровне, еще до того, как запрос достигает MVC/Web API инфраструктуры. Они работают с объектом HttpContext напрямую:

public class CustomMiddleware
{
    private readonly RequestDelegate _next;
    
    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }
    
    public async Task InvokeAsync(HttpContext context)
    {
        // Действия до следующего middleware
        Console.WriteLine($"До обработки: {context.Request.Path}");
        
        await _next(context); // Вызов следующего middleware
        
        // Действия после следующего middleware
        Console.WriteLine($"После обработки: {context.Response.StatusCode}");
    }
}

Фильтры работают внутри MVC/Web API инфраструктуры и имеют доступ к контексту действия (Action Context), параметрам действий, результатам выполнения:

public class CustomActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        // Выполняется перед действием контроллера
        var actionName = context.ActionDescriptor.DisplayName;
    }
    
    public void OnActionExecuted(ActionExecutedContext context)
    {
        // Выполняется после действия контроллера
        var result = context.Result;
    }
}

Ключевые различия

1. Уровень абстракции

  • Middleware: Работает с сырым HTTP-контекстом (HttpContext)
  • Фильтры: Работают с абстракциями MVC (контроллеры, действия, модели)

2. Точка в конвейере

HTTP Запрос → Middleware Конвейер → Маршрутизация → MVC Конвейер (Фильтры) → Action

Middleware выполняются ДО маршрутизации, а фильтры — ПОСЛЕ определения контроллера и действия.

3. Доступ к контексту MVC

  • Фильтры имеют доступ к:
    • ActionDescriptor (метаданные действия)
    • ModelState (состояние модели)
    • ControllerContext (контекст контроллера)
  • Middleware не имеет доступа к этим структурам

4. Типы и специализация

Фильтры имеют четкую специализацию:

// Авторизация - проверка прав доступа
public class CustomAuthorizationFilter : IAuthorizationFilter

// Ресурсные фильтры - кэширование, управление ресурсами
public class CustomResourceFilter : IResourceFilter

// Action фильтры - логика до/после действий
public class CustomActionFilter : IActionFilter

// Exception фильтры - обработка исключений
public class CustomExceptionFilter : IExceptionFilter

// Result фильтры - работа с результатами
public class CustomResultFilter : IResultFilter

Middleware более универсальны и могут использоваться для любых задач обработки HTTP.

5. Область применения

Когда использовать Middleware:

  • Аутентификация/авторизация (JWT, Cookies)
  • Логирование запросов
  • Обработка CORS
  • Сжатие ответов
  • Кастомная маршрутизация
  • Глобальная обработка ошибок

Когда использовать Фильтры:

  • Валидация моделей
  • Авторизация на уровне действий
  • Кэширование результатов действий
  • Измерение производительности действий
  • Изменение формата ответа
  • Логика, специфичная для бизнес-действий

Пример совместного использования

// Middleware для логирования всех запросов
app.Use(async (context, next) =>
{
    var stopwatch = Stopwatch.StartNew();
    await next();
    stopwatch.Stop();
    logger.LogInformation($"Запрос {context.Request.Path} выполнен за {stopwatch.ElapsedMilliseconds}ms");
});

// Фильтр для валидации конкретной модели
public class ValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
    }
}

// Применение фильтра к контроллеру
[ApiController]
[Route("api/[controller]")]
[ValidateModel] // Применяем фильтр ко всем действиям контроллера
public class ProductsController : ControllerBase
{
    [HttpGet("{id}")]
    public IActionResult GetProduct(int id)
    {
        // Действие с автоматической валидацией модели
    }
}

Жизненный цикл выполнения

Middleware конвейер:

  1. Выполняется для КАЖДОГО запроса
  2. Работает в порядке регистрации в Startup.Configure()
  3. Может прервать выполнение (не вызывая next())

Фильтры MVC выполняются в строгой последовательности:

  1. Authorization Filters
  2. Resource Filters
  3. Action Filters (до действия)
  4. Действие контроллера
  5. Action Filters (после действия)
  6. Exception Filters (только при ошибках)
  7. Result Filters

Производительность и рекомендации

  • Middleware обычно легче и быстрее, так как работают ближе к HTTP-уровню
  • Фильтры предоставляют более богатый контекст MVC, но с небольшими накладными расходами
  • Важно: Не дублируйте логику! Выбирайте правильный инструмент для задачи:
    • Глобальная обработка → Middleware
    • Логика, специфичная для MVC → Фильтры

Оба механизма взаимодополняемы и позволяют создавать гибкую, модульную архитектуру веб-приложений в ASP.NET Core, обеспечивая разделение ответственности на разных уровнях обработки запросов.

В чем разница между middleware и фильтром? | PrepBro