Опишите pipeline (конвейер) обработки HTTP-запроса в ASP.NET Core.

«Опишите pipeline (конвейер) обработки HTTP-запроса в ASP.NET Core.» — вопрос из категории ASP.NET Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Конвейер обработки запроса в ASP.NET Core — это цепочка компонентов middleware, через которые проходит каждый HTTP-запрос и ответ. Он настраивается в методе Configure класса Startup (или с использованием минимальных API).

Типичный порядок компонентов в конвейере:

  1. Middleware для обработки исключений (например, UseExceptionHandler) — должен быть первым, чтобы перехватывать все ошибки.
  2. Middleware для статических файлов (UseStaticFiles) — обслуживает файлы из wwwroot.
  3. Middleware маршрутизации (UseRouting) — определяет, какому endpoint (контроллеру/методу) направить запрос.
  4. Middleware аутентификации/авторизации (UseAuthentication, UseAuthorization).
  5. Middleware для сопоставления endpoints (UseEndpoints) — выполняет выбранный endpoint.

Пример кода настройки конвейера:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage(); // Middleware для страниц с ошибками в разработке
    }
    else
    {
        app.UseExceptionHandler("/Home/Error"); // Глобальный обработчик исключений
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles(); // Обслуживание CSS, JS, изображений
    app.UseRouting(); // Маршрутизация
    app.UseAuthentication(); // Аутентификация
    app.UseAuthorization(); // Авторизация

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

Ключевой принцип: Порядок регистрации middleware критически важен, так как каждый компонент может обработать запрос, передать его следующему (next.Invoke()) или завершить обработку (например, вернув ответ 404 для статического файла).