Порядок промежуточного ПО и встроенные компоненты
Разберитесь в правильном порядке промежуточного ПО для аутентификации, маршрутизации, 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 policiesCORS перед аутентификацией
Промежуточное ПО 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 — локальная установка не требуется.
Все уроки этого курса
- Обзор конвейера ASP.NET Core
- Написание собственного промежуточного ПО
- Досрочное завершение и ветвление
- Порядок промежуточного ПО и встроенные компоненты