Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão do .NET 10 deste artigo.
Aviso
Esta versão do ASP.NET Core não tem mais suporte. Para obter mais informações, consulte a Política de Suporte do .NET e do .NET Core. Para informações sobre a versão vigente, confira a versão .NET 9 deste artigo.
Este artigo descreve como lidar com erros nas APIs principais do ASP.NET. A documentação para APIs Mínimas está selecionada. Para ver a documentação das APIs baseadas em controlador, selecione a guia Controladores. Para obter diretrizes de Blazor tratamento de erros, consulte Manipular erros em aplicativos do ASP.NET CoreBlazor.
Página exceção do desenvolvedor
A Página de Exceção do Desenvolvedor exibe informações detalhadas sobre exceções de solicitação sem tratamento. Ele usa DeveloperExceptionPageMiddleware para capturar exceções síncronas e assíncronas do pipeline HTTP e gerar respostas de erro. A página de exceção do desenvolvedor é executada no início do pipeline do middleware, para que ele possa capturar exceções sem tratamento geradas no middleware a seguir.
ASP.NET Principais aplicativos habilitam a página de exceção do desenvolvedor por padrão quando ambos:
- Em execução no ambiente de desenvolvimento.
- O aplicativo foi criado com os modelos atuais, ou seja, usando WebApplication.CreateBuilder.
Os aplicativos criados usando modelos anteriores, ou seja, usando WebHost.CreateDefaultBuilder, podem habilitar a página de exceção do desenvolvedor chamando app.UseDeveloperExceptionPage.
Aviso
Não habilite a Página de Exceção do Desenvolvedor, a menos que o aplicativo esteja em execução no ambiente de desenvolvimento. Não compartilhe informações detalhadas de exceção publicamente quando o aplicativo for executado em produção. Para obter mais informações sobre como configurar ambientes, consulte ASP.NET Ambientes de runtime do Core.
A Página de Exceção do Desenvolvedor pode incluir as seguintes informações sobre a exceção e a solicitação:
- Rastreamento de pilha
- Parâmetros de cadeia de caracteres de consulta, se houver
- Cookies, se houver
- Headers
- Metadados de ponto de extremidade, se houver
A Página de Exceção do Desenvolvedor não tem garantia de fornecer nenhuma informação. Use o registro em log para obter informações de erro completas.
A imagem a seguir mostra uma página de exceção do desenvolvedor de exemplo com animação para mostrar as guias e as informações exibidas:
Em resposta a uma solicitação com um Accept: text/plain cabeçalho, a Página de Exceção do Desenvolvedor retorna texto sem formatação em vez de HTML. Por exemplo:
Status: 500 Internal Server Error
Time: 9.39 msSize: 480 bytes
FormattedRawHeadersRequest
Body
text/plain; charset=utf-8, 480 bytes
System.InvalidOperationException: Sample Exception
at WebApplicationMinimal.Program.<>c.<Main>b__0_0() in C:\Source\WebApplicationMinimal\Program.cs:line 12
at lambda_method1(Closure, Object, HttpContext)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
HEADERS
=======
Accept: text/plain
Host: localhost:7267
traceparent: 00-0eab195ea19d07b90a46cd7d6bf2f
Para ver a página de exceção do desenvolvedor em uma API mínima:
- Execute o aplicativo de exemplo no ambiente de desenvolvimento.
- Vá para o
/exceptionponto de extremidade.
Esta seção refere-se ao aplicativo de exemplo a seguir para demonstrar maneiras de lidar com exceções em uma API Mínima. Ele gera uma exceção quando o ponto /exception de extremidade é solicitado:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/exception", () =>
{
throw new InvalidOperationException("Sample Exception");
});
app.MapGet("/", () => "Test by calling /exception");
app.Run();
Manipulador de exceção
Em ambientes de não desenvolvimento, use o Middleware do Manipulador de Exceções para produzir um conteúdo de erro.
Para configurar a Exception Handler Middlewarechamada UseExceptionHandler. Por exemplo, o código a seguir altera o aplicativo para responder com uma carga compatível com RFC 7807 para o cliente. Para obter mais informações, consulte a seção Detalhes do Problema mais adiante neste artigo.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseExceptionHandler(exceptionHandlerApp
=> exceptionHandlerApp.Run(async context
=> await Results.Problem()
.ExecuteAsync(context)));
app.MapGet("/exception", () =>
{
throw new InvalidOperationException("Sample Exception");
});
app.MapGet("/", () => "Test by calling /exception");
app.Run();
Respostas de erro de cliente e servidor
Considere o aplicativo de API Mínimo a seguir.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/users/{id:int}", (int id)
=> id <= 0 ? Results.BadRequest() : Results.Ok(new User(id)));
app.MapGet("/", () => "Test by calling /users/{id:int}");
app.Run();
public record User(int Id);
O /users ponto de extremidade produz 200 OK com uma json representação de User quando id é maior que 0, caso contrário, um 400 BAD REQUEST código de status sem um corpo de resposta. Para obter mais informações sobre como criar uma resposta, consulte Criar respostas em aplicativos de API mínimos.
Pode Status Code Pages middleware ser configurado para produzir um conteúdo de corpo comum, quando vazio, para todas as respostas de cliente HTTP (400-499) ou servidor ().500 -599 O middleware é configurado chamando o método de extensão UseStatusCodePages .
Por exemplo, o exemplo a seguir altera o aplicativo para responder com uma carga compatível com RFC 7807 para o cliente para todas as respostas de cliente e servidor, incluindo erros de roteamento (por exemplo, 404 NOT FOUND). Para obter mais informações, consulte a seção Detalhes do Problema .
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseStatusCodePages(async statusCodeContext
=> await Results.Problem(statusCode: statusCodeContext.HttpContext.Response.StatusCode)
.ExecuteAsync(statusCodeContext.HttpContext));
app.MapGet("/users/{id:int}", (int id)
=> id <= 0 ? Results.BadRequest() : Results.Ok(new User(id)) );
app.MapGet("/", () => "Test by calling /users/{id:int}");
app.Run();
public record User(int Id);
Detalhes do problema
Os detalhes do problema não são o único formato de resposta a descrever um erro da API HTTP, no entanto, eles geralmente são usados para relatar erros para APIs HTTP.
O serviço de detalhes do problema implementa a IProblemDetailsService interface, que dá suporte à criação de detalhes do problema no ASP.NET Core. O AddProblemDetails(IServiceCollection) método de extensão no IServiceCollection registro da implementação padrão IProblemDetailsService .
Em aplicativos ASP.NET Core, o middleware a seguir gera respostas HTTP de detalhes do problema quando AddProblemDetails é chamado, exceto quando o Accept cabeçalho HTTP da solicitação não inclui um dos tipos de conteúdo com suporte pelo registrado IProblemDetailsWriter (padrão: application/json):
- ExceptionHandlerMiddleware: gera uma resposta de detalhes do problema quando um manipulador personalizado não é definido.
- StatusCodePagesMiddleware: gera uma resposta de detalhes do problema por padrão.
-
DeveloperExceptionPageMiddleware: gera uma resposta de detalhes do problema no desenvolvimento quando o cabeçalho HTTP da solicitação
Acceptnão incluitext/html.
Aplicativos mínimos de API podem ser configurados para gerar a resposta de detalhes do problema para todas as respostas de erro do cliente HTTP e do servidor que ainda não têm conteúdo do corpo usando o método de AddProblemDetails extensão.
O código a seguir configura o aplicativo para gerar detalhes do problema:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddProblemDetails();
var app = builder.Build();
app.UseExceptionHandler();
app.UseStatusCodePages();
app.MapGet("/users/{id:int}", (int id)
=> id <= 0 ? Results.BadRequest() : Results.Ok(new User(id)));
app.MapGet("/", () => "Test by calling /users/{id:int}");
app.Run();
public record User(int Id);
Para obter mais informações sobre como usar AddProblemDetails, consulte Detalhes do problema
Fallback IProblemDetailsService
No código a seguir, httpContext.Response.WriteAsync("Fallback: An error occurred.") retornará um erro se a IProblemDetailsService implementação não for capaz de gerar um ProblemDetails:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddProblemDetails();
var app = builder.Build();
app.UseExceptionHandler(exceptionHandlerApp =>
{
exceptionHandlerApp.Run(async httpContext =>
{
var pds = httpContext.RequestServices.GetService<IProblemDetailsService>();
if (pds == null
|| !await pds.TryWriteAsync(new() { HttpContext = httpContext }))
{
// Fallback behavior
await httpContext.Response.WriteAsync("Fallback: An error occurred.");
}
});
});
app.MapGet("/exception", () =>
{
throw new InvalidOperationException("Sample Exception");
});
app.MapGet("/", () => "Test by calling /exception");
app.Run();
O código anterior:
- Grava uma mensagem de erro com o código de fallback se não
problemDetailsServicefor possível gravar umProblemDetails. Por exemplo, um ponto de extremidade em que o cabeçalho aceitar solicitação especifica um tipo de mídia queDefaulProblemDetailsWriternão dá suporte. - Usa o middleware do manipulador de exceções.
O exemplo a seguir é semelhante ao anterior, exceto pelo fato de chamar o Status Code Pages middleware.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddProblemDetails();
var app = builder.Build();
app.UseStatusCodePages(statusCodeHandlerApp =>
{
statusCodeHandlerApp.Run(async httpContext =>
{
var pds = httpContext.RequestServices.GetService<IProblemDetailsService>();
if (pds == null
|| !await pds.TryWriteAsync(new() { HttpContext = httpContext }))
{
// Fallback behavior
await httpContext.Response.WriteAsync("Fallback: An error occurred.");
}
});
});
app.MapGet("/users/{id:int}", (int id) =>
{
return id <= 0 ? Results.BadRequest() : Results.Ok(new User(id));
});
app.MapGet("/", () => "Test by calling /users/{id:int}");
app.Run();
public record User(int Id);
Recursos adicionais de tratamento de erros
Migração de controladores para APIs mínimas
Se você estiver migrando de APIs baseadas em controlador para APIs mínimas:
- Substituir filtros de ação por filtros de ponto de extremidade ou middleware
- Substituir validação de modelo por validação manual ou associação personalizada
- Substituir filtros de exceção por middleware de tratamento de exceção
-
Configurar detalhes do problema usando
AddProblemDetails()respostas de erro consistentes
Quando usar o tratamento de erros baseado em controlador
Considere AS APIs baseadas em controlador se você precisar:
- Cenários complexos de validação de modelo
- Tratamento centralizado de exceções entre vários controladores
- Controle refinado sobre a formatação de resposta de erro
- Integração com recursos do MVC, como filtros e convenções
Para obter informações detalhadas sobre o tratamento de erros baseados em controlador, incluindo erros de validação, personalização de detalhes do problema e filtros de exceção, consulte as seções da guia Controladores .