Dela via


Hantera fel i ASP.NET Core-API:er

Anmärkning

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Varning

Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Viktigt!

Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.

För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

Den här artikeln beskriver hur du hanterar fel i ASP.NET Core-API:er. Dokumentation för minimala API:er har valts. Om du vill se dokumentationen för kontrollantbaserade API:er väljer du fliken Kontrollanter. Vägledning för Blazor felhantering finns i Hantera fel i ASP.NET Core-apparBlazor.

Undantagssida för utvecklare

Sidan Undantag för utvecklare visar detaljerad information om ohanterade undantag för begäranden. Den använder DeveloperExceptionPageMiddleware för att samla in synkrona och asynkrona undantag från HTTP-pipelinen och för att generera felsvar. Undantagssidan för utvecklare körs tidigt i pipelinen för mellanprogram, så att den kan fånga ohanterade undantag som genereras i mellanprogram som följer.

ASP.NET Core-appar aktiverar utvecklarens undantagssida som standard när båda:

Appar som skapats med hjälp av tidigare mallar, d.v.s. med hjälp WebHost.CreateDefaultBuilderav , kan aktivera undantagssidan för utvecklare genom att anropa app.UseDeveloperExceptionPage.

Varning

Aktivera inte undantagssidan för utvecklare om inte appen körs i utvecklingsmiljön. Dela inte detaljerad undantagsinformation offentligt när appen körs i produktion. Mer information om hur du konfigurerar miljöer finns i ASP.NET Core Runtime-miljöer.

Sidan Undantag för utvecklare kan innehålla följande information om undantaget och begäran:

  • Stackspårning
  • Frågesträngsparametrar, om några
  • Cookies, om några
  • Headers
  • Slutpunktsmetadata, om några

Undantagssidan för utvecklare är inte garanterad att ange någon information. Använd Loggning för fullständig felinformation.

Följande bild visar ett exempel på en undantagssida för utvecklare med animering för att visa flikarna och informationen som visas:

Utvecklarens undantagssida animerad för att visa varje flik markerad.

Som svar på en begäran med en Accept: text/plain rubrik returnerar undantagssidan för utvecklare oformaterad text i stället för HTML. Till exempel:

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

Så här ser du undantagssidan för utvecklare i ett minimalt API:

Det här avsnittet refererar till följande exempelapp för att demonstrera sätt att hantera undantag i ett minimalt API. Det utlöser ett undantag när slutpunkten /exception begärs:

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();

Undantagshanterare

I miljöer som inte är utvecklingsmiljöer använder du undantagshanterarens mellanprogram för att skapa en nyttolast för fel.

Om du vill konfigurera Exception Handler Middlewareanropar UseExceptionHandlerdu . Följande kod ändrar till exempel appen så att den svarar med en RFC 7807-kompatibel nyttolast till klienten. Mer information finns i avsnittet Probleminformation senare i den här artikeln.

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();

Svar på klient- och serverfel

Överväg följande minimala API-app.

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);

Slutpunkten /users skapas 200 OK med en json representation av User när id är större än 0, annars en 400 BAD REQUEST statuskod utan svarstext. Mer information om hur du skapar ett svar finns i Skapa svar i Minimala API-appar.

Status Code Pages middleware Kan konfigureras för att skapa ett gemensamt brödtextinnehåll, när det är tomt, för alla HTTP-klientsvar (400-499) eller server (500 -599). Mellanprogrammet konfigureras genom att anropa tilläggsmetoden UseStatusCodePages .

I följande exempel ändras till exempel appen så att den svarar med en RFC 7807-kompatibel nyttolast till klienten för alla klient- och serversvar, inklusive routningsfel (till exempel 404 NOT FOUND). Mer information finns i avsnittet Probleminformation .

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);

Probleminformation

Probleminformation är inte det enda svarsformatet som beskriver ett HTTP API-fel, men de används ofta för att rapportera fel för HTTP-API:er.

Tjänsten probleminformation implementerar IProblemDetailsService gränssnittet, som har stöd för att skapa probleminformation i ASP.NET Core. Tilläggsmetoden AddProblemDetails(IServiceCollection) i IServiceCollection registrerar standardimplementeringen IProblemDetailsService .

I ASP.NET Core-appar genererar följande mellanprogram PROBLEMINFORMATION HTTP-svar när AddProblemDetails anropas, förutom när Accept HTTP-rubriken för begäran inte innehåller någon av de innehållstyper som stöds av den registrerade IProblemDetailsWriter (standard: application/json):

Minimala API-appar kan konfigureras för att generera probleminformationssvar för alla HTTP-klient- och serverfelsvar som ännu inte har brödtextinnehåll med hjälp AddProblemDetails av tilläggsmetoden.

Följande kod konfigurerar appen för att generera probleminformation:

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);

Mer information om hur du använder AddProblemDetailsfinns i Probleminformation

Reserv för IProblemDetailsService

I följande kod httpContext.Response.WriteAsync("Fallback: An error occurred.") returnerar ett fel om implementeringen IProblemDetailsService inte kan generera en 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();

Föregående kod:

Följande exempel liknar föregående förutom att det anropar 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);

Ytterligare funktioner för felhantering

Migrering från kontrollanter till minimala API:er

Om du migrerar från kontrollantbaserade API:er till Minimala API:er:

  1. Ersätt åtgärdsfilter med slutpunktsfilter eller mellanprogram
  2. Ersätt modellverifiering med manuell validering eller anpassad bindning
  3. Ersätt undantagsfilter med undantagshantering av mellanprogram
  4. Konfigurera probleminformation med hjälp av AddProblemDetails() konsekventa felsvar

När du ska använda kontrollantbaserad felhantering

Överväg kontrollantbaserade API:er om du behöver:

  • Komplexa modellvalideringsscenarier
  • Centraliserad undantagshantering över flera styrenheter
  • Detaljerad kontroll över formatering av felsvar
  • Integrering med MVC-funktioner som filter och konventioner

Detaljerad information om kontrollantbaserad felhantering, inklusive valideringsfel, anpassning av probleminformation och undantagsfilter finns i avsnitten på fliken Kontrollanter .

Ytterligare resurser