0Pricing
C# Academy · Aula

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 JSON

Arquivos 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 policies

CORS 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 pipeline

Exemplo 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

  1. Visão geral do pipeline do ASP.NET Core
  2. Escrevendo middleware personalizado
  3. Interrupção antecipada e ramificação
  4. Ordenação do middleware e middleware integrado
← Voltar para C# Academy