Что такое параметр `next` в middleware ASP.NET Core?

«Что такое параметр `next` в middleware ASP.NET Core?» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Параметр next в middleware ASP.NET Core — это делегат типа RequestDelegate, который представляет следующий компонент middleware в конвейере обработки запроса. Вызов await next.Invoke() передает управление следующему middleware.

Роль и поведение:

  • Передача управления: Без вызова next() конвейер обрывается, и последующие middleware не выполняются. Это называется short-circuiting и используется middlewareми, которые полностью обрабатывают запрос (например, UseStaticFiles или UseAuthentication для неудачной аутентификации).
  • Контроль потока: Позволяет выполнить код как до, так и после следующего middleware в цепочке.

Пример middleware с логированием времени выполнения:

app.Use(async (HttpContext context, RequestDelegate next) =>
{
    // Код, выполняемый ДО следующего middleware
    var stopwatch = Stopwatch.StartNew();
    Log.Information("Начало обработки запроса {Path}", context.Request.Path);

    // Передача управления следующему middleware в конвейере
    await next(context);

    // Код, выполняемый ПОСЛЕ следующего middleware
    stopwatch.Stop();
    Log.Information("Запрос {Path} обработан за {ElapsedMs} мс", 
                    context.Request.Path, stopwatch.ElapsedMilliseconds);
});

Критические аспекты:

  1. Порядок регистрации: Порядок вызовов app.Use() или app.UseMiddleware() в Program.cs определяет порядок выполнения middleware. next всегда ссылается на следующего по списку.
  2. Обработка исключений: Исключения, возникшие в последующих middleware, "всплывают" через вызов next(). Для их глобальной обработки используется специальное middleware app.UseExceptionHandler(), которое регистрируется первым в конвейере.
  3. Модификация ответа: После вызова next() можно читать и, с осторожностью, модифицировать ответ (например, добавлять заголовки), но нельзя изменять тело ответа, если оно уже было отправлено клиенту.