0Pricing
C# Academy · Урок

Порядок промежуточного ПО и встроенные компоненты

Разберитесь в правильном порядке промежуточного ПО для аутентификации, маршрутизации, CORS и обработки исключений.

«Порядок промежуточного ПО и встроенные компоненты» — бесплатный урок C# Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.

Почему важен порядок

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

Рекомендуемый порядок промежуточного ПО

Microsoft документирует рекомендуемый порядок. Отклонение от него приводит к трудно диагностируемым проблемам. Ниже приведён общепринятый порядок для рабочего API ASP.NET Core.

// Recommended order:
app.UseExceptionHandler();    // 1. Catch all exceptions
app.UseHsts();                // 2. HTTP Strict Transport Security
app.UseHttpsRedirection();    // 3. Redirect HTTP to HTTPS
app.UseStaticFiles();         // 4. Serve static assets
app.UseRouting();             // 5. Match route patterns
app.UseCors();                // 6. Cross-Origin
app.UseAuthentication();      // 7. Who are you?
app.UseAuthorization();       // 8. Are you allowed?
app.UseRateLimiter();         // 9. Throttle
app.UseOutputCache();         // 10. Cache responses
// Map endpoints here
app.MapControllers();
app.Run();

Сначала обработка исключений

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

// Development: detailed error page
if (app.Environment.IsDevelopment())
    app.UseDeveloperExceptionPage();
else
{
    // Production: generic error page + structured response
    app.UseExceptionHandler("/error");
    app.UseHsts();
}

// OR: use ProblemDetails globally (recommended .NET 8+)
builder.Services.AddProblemDetails();
app.UseExceptionHandler();
// All unhandled exceptions -> RFC 7807 ProblemDetails JSON

Статические файлы до маршрутизации

Статические файлы (UseStaticFiles) должны обрабатываться до маршрутизации. Отправка статического файла досрочно завершает конвейер — для /css/main.css нет необходимости запускать аутентификацию или маршрутизацию.

app.UseStaticFiles(); // serves wwwroot/* without going through auth
app.UseRouting();     // expensive: runs route matching

// If you put UseStaticFiles AFTER UseRouting, the route
// matcher runs unnecessarily for every .js/.css request.
// Serve static files first for better performance.

Аутентификация до авторизации

UseAuthentication должен выполняться до UseAuthorization. Аутентификация заполняет HttpContext.User, а авторизация проверяет этого пользователя по политикам.

// WRONG ORDER — authorization runs before user is populated:
app.UseAuthorization();  // user is null → everything allowed!
app.UseAuthentication(); // too late

// CORRECT:
app.UseAuthentication(); // populates context.User
app.UseAuthorization();  // checks context.User against policies

CORS перед аутентификацией

Промежуточное ПО CORS должно выполняться до аутентификации, чтобы предварительные запросы OPTIONS обрабатывались без необходимости передавать заголовки аутентификации.

builder.Services.AddCors(opts =>
    opts.AddPolicy("Frontend", p =>
        p.WithOrigins("https://myapp.com")
         .AllowAnyHeader()
         .AllowAnyMethod()));

app.UseRouting();
app.UseCors("Frontend"); // before auth — handles OPTIONS pre-flight
app.UseAuthentication();
app.UseAuthorization();

Распространённые встроенные компоненты промежуточного ПО

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

// Compression: compresses responses (must be before static files)
builder.Services.AddResponseCompression();
app.UseResponseCompression();

// Request localization: sets culture from Accept-Language header
builder.Services.AddLocalization();
app.UseRequestLocalization();

// Health checks: /health endpoint
builder.Services.AddHealthChecks();
app.MapHealthChecks("/health");

// Forwarded headers: trust X-Forwarded-For from reverse proxy
app.UseForwardedHeaders();

Подробно о промежуточном ПО маршрутизации

UseRouting() сопоставляет входящий запрос с шаблоном маршрута и сохраняет результат сопоставления в HttpContext. Затем UseEndpoints() (или MapXxx()) выполняет сопоставленную конечную точку.

app.UseRouting(); // matches route, stores in context

// Between UseRouting and Map*: middleware can read route data
app.Use(async (ctx, next) =>
{
    var endpoint = ctx.GetEndpoint();
    var routeName = endpoint?.DisplayName;
    Console.WriteLine($"Matched: {routeName}");
    await next(ctx);
});

// All auth and other middleware go here
app.UseAuthentication();
app.UseAuthorization();

// Execute the matched endpoint
app.MapControllers();
app.MapGet("/", () => "Home");

Порядок размещения сжатия ответа

Сжатие ответа должно выполняться до обработки статических файлов и маршрутизации, чтобы сжатые данные записывались до формирования содержимого. Разместите его сразу после обработки исключений.

// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles();          // compressed static files
app.UseRouting();
// ... rest of pipeline

Практический пример: полный рабочий конвейер

Полный рабочий конвейер, объединяющий все рекомендации в правильно упорядоченный и защищённый набор промежуточного ПО.

var app = builder.Build();

if (app.Environment.IsDevelopment())
    app.UseDeveloperExceptionPage();
else { app.UseExceptionHandler(); app.UseHsts(); }

app.UseResponseCompression();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("AllowFrontend");
app.UseAuthentication();
app.UseAuthorization();
app.UseRateLimiter();
app.UseOutputCache();

app.MapHealthChecks("/health").AllowAnonymous();
app.MapControllers();

app.Run();

Быстрая проверка

Почему UseAuthentication должно выполняться перед UseAuthorization в конвейере промежуточного ПО?

Итоги: порядок промежуточного ПО и встроенное промежуточное ПО

Главные выводы:

  • Сначала обработка исключений, статические файлы перед маршрутизацией, аутентификация перед авторизацией, CORS перед аутентификацией
  • Сжатие ответа следует размещать в начале (до статических файлов) для максимального эффекта
  • UseRouting + UseAuthorization + Map* — промежуточное ПО между ними может читать данные маршрута
  • Встроенные компоненты: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
  • Проверяйте ctx.GetEndpoint() между UseRouting и MapXxx, чтобы прочитать сведения о сопоставленном маршруте

Часто задаваемые вопросы

Урок «Порядок промежуточного ПО и встроенные компоненты» бесплатный?

Да — полный текст урока «Порядок промежуточного ПО и встроенные компоненты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.

Чему я научусь в уроке «Порядок промежуточного ПО и встроенные компоненты»?

Разберитесь в правильном порядке промежуточного ПО для аутентификации, маршрутизации, CORS и обработки исключений. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C# Academy?

Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Порядок промежуточного ПО и встроенные компоненты»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C# Academy?

Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обзор конвейера ASP.NET Core
  2. Написание собственного промежуточного ПО
  3. Досрочное завершение и ветвление
  4. Порядок промежуточного ПО и встроенные компоненты
← Назад к C# Academy