Для чего нужен метод Configure в классе Startup ASP.NET Core?

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

Ответ

Метод Configure в классе Startup отвечает за построение конвейера обработки HTTP-запросов (pipeline). Он определяет, в каком порядке различные компоненты (middleware) будут обрабатывать входящие запросы и исходящие ответы.

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

Пример с пояснениями:

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

    // 2. Middleware для обработки статических файлов (CSS, JS, изображения)
    app.UseStaticFiles();

    // 3. Middleware для маршрутизации
    app.UseRouting();

    // 4. Middleware для аутентификации и авторизации
    app.UseAuthentication();
    app.UseAuthorization();

    // 5. Определение конечных точек (endpoints)
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
        endpoints.MapRazorPages();
    });
}

Ключевые принципы:

  • Порядок имеет критическое значение. Middleware выполняется в порядке их добавления. Например, UseStaticFiles() должен быть до UseRouting(), чтобы статические файлы обрабатывались без лишних проверок.
  • Middleware решает, передать ли запрос дальше. Вызов next.Invoke() передает управление следующему компоненту в конвейере.
  • Конфигурация зависит от окружения. Используйте IWebHostEnvironment (например, env.IsDevelopment()), чтобы настраивать pipeline для разных сред (разработка, продакшн).