Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dies ist nicht die neueste Version dieses Artikels. Die aktuelle Version finden Sie in der .NET 10-Version dieses Artikels.
Warnung
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie unter .NET und .NET Core Support Policy. Die aktuelle Version finden Sie in der .NET 10-Version dieses Artikels.
In diesem Artikel wird beschrieben, wie Fehler in ASP.NET Core APIs behandelt werden. Die Dokumentation für minimale APIs ist ausgewählt. Um die Dokumentation für controllerbasierte APIs anzuzeigen, wählen Sie die Registerkarte Controller aus. Informationen zu Blazor Fehlerbehandlungsanleitungen finden Sie unter Handle-Fehler in ASP.NET Core Blazor Apps.
Entwickler-Ausnahmeseite
Die Seite mit Ausnahmen für Entwickler enthält ausführliche Informationen zu unbehandelten Anforderungsausnahmen. Es verwendet DeveloperExceptionPageMiddleware, um synchrone und asynchrone Ausnahmen aus der HTTP-Pipeline zu erfassen und um Fehlerantworten zu generieren. Die Entwickler-Ausnahmeseite läuft früh in der Middleware-Pipeline, damit sie unbehandelte Ausnahmen erfassen kann, die in der nachfolgenden Middleware ausgelöst werden.
ASP.NET Core Apps aktivieren standardmäßig die Entwickler ausnahmeseite, wenn beides:
- Wird in der
DevelopmentUmgebung ausgeführt. - Die App wurde mit den aktuellen Vorlagen erstellt, d. h. mithilfe von WebApplication.CreateBuilder.
Apps, die mit früheren Vorlagen erstellt wurden, d. h. mithilfe von WebHost.CreateDefaultBuilder, können die Seite mit Ausnahmen für Entwickler durch Aufrufen von app.UseDeveloperExceptionPage aktivieren.
Warnung
Aktivieren Sie die Entwickler-Ausnahmeseite nicht , es sei denn, die App wird in der Development Umgebung ausgeführt. Geben Sie keine detaillierten Ausnahmeinformationen öffentlich frei, wenn die App in der Produktion ausgeführt wird. Weitere Informationen zum Konfigurieren von Umgebungen finden Sie unter ASP.NET Core Laufzeitumgebungen.
Die Entwickler-Ausnahmeseite kann die folgenden Informationen über die Ausnahme und die Anfrage enthalten:
- Stack-Trace
- Abfragezeichenfolgenparameter( falls vorhanden)
- Cookies, falls vorhanden
- Headers
- Endpunktmetadaten( falls vorhanden)
Die Entwickler-Ausnahmeseite bietet keine Garantie, dass sie Informationen liefert. Verwenden Sie Logging für vollständige Fehlerinformationen.
Die folgende Abbildung zeigt eine Beispielseite für Entwicklerausnahmen mit Animation, um die Registerkarten und die angezeigten Informationen anzuzeigen:
Als Reaktion auf eine Anforderung mit einem Accept: text/plain-Header gibt die Seite mit Ausnahmen für Entwickler nur Text anstelle von HTML zurück. Beispiel:
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
So zeigen Sie die Entwickler-Ausnahmeseite bei einer minimalen API an:
- Führen Sie die Beispiel-App in der
DevelopmentUmgebung aus. - Gehen Sie zum
/exception-Endpunkt.
Dieser Abschnitt bezieht sich auf die folgende Beispiel-App, um Möglichkeiten zum Behandeln von Ausnahmen in einer minimalen API zu veranschaulichen. Es löst eine Ausnahme aus, wenn der Endpunkt /exception angefordert wird:
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();
Ausnahmehandler
Verwenden Sie in Nichtentwicklungsumgebungen die Ausnahmehandler-Middleware , um eine Fehlernutzlast zu erzeugen.
Um exception handler middleware zu konfigurieren, rufen Sie UseExceptionHandler auf. Der folgende Code ändert beispielsweise die App so, dass sie mit einer RFC 7807-kompatiblen Nutzlast auf den Client reagiert. Weitere Informationen finden Sie im Abschnitt "Problemdetails " weiter unten in diesem Artikel.
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();
Client- und Serverfehlerantworten
Betrachten Sie die folgende Minimale 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);
Der /users-Endpunkt liefert 200 OK mit einer json-Darstellung von User, wenn id größer als 0 ist, andernfalls einen 400 BAD REQUEST-Statuscode ohne Antworttextkörper. Weitere Informationen zum Erstellen einer Antwort finden Sie unter Erstellen von Antworten in minimalen API-Apps.
Das Status Code Pages middleware kann so konfiguriert werden, dass wenn leer für alle HTTP-Client- (400-499) oder Serverantworten (500 -599) ein gemeinsamer Antworttext erzeugt wird. Die Middleware wird durch Aufrufen der UseStatusCodePages-Erweiterungsmethode konfiguriert.
So ändert das folgende Beispiel die App beispielsweise so, dass sie bei allen Client- und Serverantworten mit einer RFC 7807-konformen Payload an den Client antwortet, einschließlich Routingfehlern (z. B. 404 NOT FOUND). Weitere Informationen finden Sie im Abschnitt "Problemdetails ".
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);
Problemdetails
Problemdetails sind nicht das einzige Antwortformat zur Beschreibung eines HTTP-API-Fehlers, sie werden jedoch häufig verwendet, um Fehler für HTTP-APIs zu melden.
Der Problemdetails-Dienst implementiert die schnittstelle IProblemDetailsService, die das Erstellen von Problemdetails in ASP.NET Core unterstützt. Die Erweiterungsmethode AddProblemDetails(IServiceCollection) in IServiceCollection registriert die Standardimplementierung von IProblemDetailsService.
In ASP.NET Core Apps generiert die folgende Middleware HTTP-Antworten mit Problemdetails, wenn AddProblemDetails aufgerufen wird, es sei denn, die Accept Anforderungs-HTTP-Header enthält keinen der vom registrierten IProblemDetailsWriter unterstützten Inhaltstypen (Standard: application/json):
- ExceptionHandlerMiddleware generiert eine Problemdetailantwort, wenn kein benutzerdefinierter Handler definiert ist.
- StatusCodePagesMiddleware generiert standardmäßig eine Problemdetailantwort.
-
DeveloperExceptionPageMiddleware generiert eine Problemdetailantwort während der Entwicklungsphase, wenn der
Accept-HTTP-Anforderungsheader nichttext/htmlenthält.
Minimale API-Apps können so konfiguriert werden, dass die Antwort auf Problemdetails für alle HTTP-Client- und Serverfehlerantworten generiert wird, die noch keinen Textinhalt haben , indem sie die AddProblemDetails Erweiterungsmethode verwenden.
Mit dem folgenden Code wird die App so konfiguriert, dass Problemdetails generiert werden:
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);
Weitere Informationen zur Verwendung AddProblemDetailsfinden Sie unter Problemdetails
IProblemDetailsService Fallback
Im folgenden Code gibt httpContext.Response.WriteAsync("Fallback: An error occurred.") einen Fehler zurück, wenn die IProblemDetailsService-Implementierung nicht in der Lage ist, ProblemDetails zu generieren:
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();
Der vorherige Code:
- Schreibt eine Fehlermeldung mit dem Fallback-Code, wenn
problemDetailsServicenicht in der Lage ist, einProblemDetailszu schreiben. Zum Beispiel ein Endpunkt, bei dem der Anforderungsheader Accept einen Medientyp angibt, denDefaultProblemDetailsWriternicht unterstützt. - Verwendet die Exception-Handler-Middleware.
Hinweis
Das DefaultProblemDetailsWriter unterstützt die folgenden Medientypen im Anforderungsheader Accept:
application/jsonapplication/problem+json- Wildcardtypen wie
*/*undapplication/*
Nicht-JSON-Medientypen wie application/xml oder text/html werden nicht unterstützt und lösen das Fallback-Verhalten aus.
Das folgende Beispiel ähnelt dem vorherigen, nur dass es Status Code Pages middleware aufruft.
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);
Zusätzliche Fehlerbehandlungsfunktionen
Migration von Controllern zu minimalen APIs
Wenn Sie von controllerbasierten APIs zu minimalen APIs migrieren:
- Ersetzen von Aktionsfiltern durch Endpunktfilter oder Middleware
- Ersetzen der Modellüberprüfung durch manuelle Überprüfung oder benutzerdefinierte Bindung
- Ersetzen von Ausnahmefiltern durch Middleware für die Ausnahmebehandlung
-
Konfigurieren Sie Problemdetails mit
AddProblemDetails()für konsistente Fehlerantworten
Wann die controllerbasierte Fehlerbehandlung verwendet werden sollte
Berücksichtigen Sie bei Bedarf controllerbasierte APIs:
- Komplexe Modellüberprüfungsszenarien
- Zentralisierte Ausnahmebehandlung über mehrere Controller hinweg
- Feinkörnige Kontrolle über die Fehlerantwortformatierung
- Integration in MVC-Features wie Filter und Konventionen
Ausführliche Informationen zur controllerbasierten Fehlerbehandlung, einschließlich Validierungsfehlern, Anpassung von Problemen und Ausnahmefiltern, finden Sie in den Registerkartenabschnitten " Controller ".