Ordenação do middleware e middleware integrado
Entenda a ordenação correta do middleware para autenticação, roteamento, CORS e tratamento de exceções.
Ordenação do middleware e middleware integrado é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.
Por que a ordem é importante
Os componentes intermediários do ASP.NET Core são executados exatamente na ordem em que são registrados. A ordem errada causa falhas de segurança, problemas de desempenho ou comportamento incorreto — por exemplo, o roteamento deve vir antes da autorização, que deve vir antes da execução dos pontos de extremidade.
A ordem recomendada dos componentes intermediários
A Microsoft documenta a ordem recomendada. Desviar dela cria problemas difíceis de depurar. Esta é a ordem canônica para uma API ASP.NET Core de produção.
// 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();Tratamento de exceções primeiro
O componente intermediário de tratamento de exceções deve ser o primeiro, o mais externo, para capturar exceções de todos os componentes intermediários e pontos de extremidade seguintes.
// 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 JSONArquivos estáticos antes do roteamento
Os arquivos estáticos, por meio de UseStaticFiles, devem vir antes do roteamento. Fornecer um arquivo estático interrompe antecipadamente o fluxo — não é necessário executar autenticação nem roteamento para /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.Autenticação antes da autorização
UseAuthentication deve vir antes de UseAuthorization. A autenticação preenche HttpContext.User; a autorização verifica esse usuário preenchido em relação às políticas.
// 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 antes da autenticação
O componente intermediário de CORS deve ser executado antes da autenticação para que as solicitações de pré-verificação OPTIONS sejam tratadas sem exigir cabeçalhos de autenticação.
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();Componentes intermediários integrados comuns
O ASP.NET Core inclui muitos componentes intermediários integrados. Saber o que cada um faz ajuda você a entender quando e como usá-los.
// 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();Análise aprofundada do componente intermediário de roteamento
UseRouting() associa a solicitação recebida a um padrão de rota e armazena a correspondência em HttpContext. UseEndpoints() (ou MapXxx()) então executa o ponto de extremidade correspondente.
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");Posicionamento da compactação de respostas
A compactação de respostas deve vir antes dos arquivos estáticos e do roteamento para que a saída compactada seja gravada antes da geração do conteúdo. Coloque-a imediatamente após o tratamento de exceções.
// Correct placement for response compression:
app.UseExceptionHandler();
app.UseResponseCompression(); // before static files
app.UseStaticFiles(); // compressed static files
app.UseRouting();
// ... rest of pipelineExemplo real: cadeia de processamento completa de produção
Uma cadeia de processamento completa para produção, combinando todas as recomendações em uma pilha de componentes intermediários segura e bem ordenada.
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();Verificação rápida
Por que UseAuthentication deve vir antes de UseAuthorization na cadeia de componentes intermediários?
Recapitulação: ordenação dos componentes intermediários e componentes integrados
Principais conclusões:
- Tratamento de exceções primeiro, arquivos estáticos antes do roteamento, autenticação antes da autorização, CORS antes da autenticação
- A compactação de respostas vem no início (antes dos arquivos estáticos) para maximizar o efeito
- UseRouting + UseAuthorization + Map* — os componentes intermediários entre eles podem ler os dados da rota
- Integrados: UseHsts, UseHttpsRedirection, UseStaticFiles, UseRateLimiter, UseOutputCache
- Verifique
ctx.GetEndpoint()entre UseRouting e MapXxx para ler as informações da rota correspondente
Perguntas Frequentes
A aula “Ordenação do middleware e middleware integrado” é grátis?
Sim — o texto completo de “Ordenação do middleware e middleware integrado” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.
O que vou aprender em “Ordenação do middleware e middleware integrado”?
Entenda a ordenação correta do middleware para autenticação, roteamento, CORS e tratamento de exceções. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Ordenação do middleware e middleware integrado”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Visão geral do pipeline do ASP.NET Core
- Escrevendo middleware personalizado
- Interrupção antecipada e ramificação
- Ordenação do middleware e middleware integrado