Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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:
- Körs i utvecklingsmiljön.
- Appen skapades med de aktuella mallarna, dvs. med hjälp WebApplication.CreateBuilderav .
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:
              
               
              
              
            
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:
- Kör exempelappen i utvecklingsmiljön.
- Gå till /exceptionslutpunkten.
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):
- ExceptionHandlerMiddleware: Genererar ett probleminformationssvar när en anpassad hanterare inte har definierats.
- StatusCodePagesMiddleware: Genererar ett probleminformationssvar som standard.
- 
              DeveloperExceptionPageMiddleware: Genererar ett probleminformationssvar under utveckling när AcceptHTTP-rubriken för begäran inte innehållertext/html.
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:
- Skriver ett felmeddelande med återställningskoden om det problemDetailsServiceinte går att skriva enProblemDetails. Till exempel en slutpunkt där rubriken Acceptera begäran anger en medietyp somDefaulProblemDetailsWriterinte stöds.
- Använder undantagshanterarens mellanprogram.
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:
- Ersätt åtgärdsfilter med slutpunktsfilter eller mellanprogram
- Ersätt modellverifiering med manuell validering eller anpassad bindning
- Ersätt undantagsfilter med undantagshantering av mellanprogram
- 
              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
ASP.NET Core