Встречается на 66% собеседований по C#

Что такое middleware в ASP.NET core

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

Как это работает

Middleware организованы в виде конвейера (pipeline). Когда приложение получает HTTP-запрос, он последовательно проходит через все зарегистрированные компоненты. Каждый middleware получает объект HttpContext, содержащий информацию о запросе и ответе, и может:

  • Обработать запрос до вызова следующего компонента.
  • Передать управление следующему компоненту через RequestDelegate.
  • Обработать ответ после того, как последующие компоненты завершили работу.

Порядок регистрации middleware в конвейере определяет порядок их выполнения. Компоненты, зарегистрированные раньше, выполняются первыми при обработке запроса и последними при обработке ответа.

Пример

Создание собственного middleware обычно включает класс с конструктором, принимающим RequestDelegate, и метод InvokeAsync (или Invoke), который вызывается для каждого запроса. Пример простого middleware, логирующего время обработки:

csharp
public class LoggingMiddleware
{
    private readonly RequestDelegate _next;

    public LoggingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        // Действия до передачи управления следующему компоненту
        var start = DateTime.UtcNow;
        Console.WriteLine($"Запрос: {context.Request.Path} в {start}");

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

        // Действия после обработки запроса последующими компонентами
        var duration = DateTime.UtcNow - start;
        Console.WriteLine($"Ответ: {context.Response.StatusCode} за {duration.TotalMilliseconds} мс");
    }
}

Регистрация middleware в классе Startup (или в Program.cs для минимального хостинга) выполняется в методе Configure с помощью UseMiddleware<T>() или встроенных методов расширения:

csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseMiddleware<LoggingMiddleware>();
    // Другие middleware, например:
    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}

Подводные камни

  • Порядок регистрации критичен. Например, UseAuthentication должен быть вызван до UseAuthorization, иначе авторизация не будет работать корректно.
  • Не забывайте вызывать _next(context). Если middleware не передаст управление дальше, конвейер оборвётся, и запрос не будет обработан последующими компонентами.
  • Исключения в middleware могут быть перехвачены только теми компонентами, которые находятся выше по конвейеру. Поэтому обработку ошибок обычно размещают первым.
  • Не выполняйте тяжёлые операции в middleware без необходимости, так как они выполняются для каждого запроса и могут снизить производительность.

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

Middleware подходит для задач, которые должны выполняться для всех или большинства запросов: аутентификация, логирование, обработка ошибок, сжатие ответов, обслуживание статических файлов. Встроенные middleware в ASP.NET Core покрывают многие типовые сценарии, но при необходимости легко создать собственный компонент.

Коротко

  • Middleware — это компоненты конвейера обработки HTTP-запросов в ASP.NET Core.
  • Каждый middleware может выполнять код до и после вызова _next(context).
  • Порядок регистрации в Configure определяет порядок выполнения.
  • Используется для сквозных задач: логирование, аутентификация, обработка ошибок, статические файлы.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы