Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwaga / Notatka
Nie jest to najnowsza wersja tego artykułu. Aby uzyskać bieżącą wersję, zobacz artykuł w wersji .NET 10.
Ostrzeżenie
Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz .NET i .NET Core Support Policy. Aby uzyskać bieżącą wersję, zobacz artykuł w wersji .NET 10.
- Minimalne interfejsy API
- Kontrolery
W tym artykule opisano sposób obsługi błędów w interfejsach API ASP.NET Core. Wybrano dokumentację dla minimalnych interfejsów API. Aby wyświetlić dokumentację interfejsów API opartych na kontrolerach, wybierz kartę Controllers. Aby uzyskać wskazówki dotyczące obsługi błędów Blazor, zobacz Obsługi błędów w ASP.NET Core Blazor apps.
Strona wyjątku dla deweloperów
Strona wyjątków dewelopera wyświetla szczegółowe informacje o nieobsłużonych wyjątkach żądań. Używa go do przechwytywania synchronicznych i asynchronicznych wyjątków z potoku HTTP i generowania odpowiedzi o błędach. Strona wyjątku dla deweloperów jest uruchamiana na wczesnym etapie pipeline'u pośredniczącego, dzięki czemu może przechwytywać nieobsługiwane wyjątki zgłaszane w oprogramowaniu pośredniczącym, które następuje.
Aplikacje ASP.NET Core włączają domyślnie stronę wyjątków dla deweloperów, gdy spełnione są oba poniższe warunki:
- Działanie w środowisku.
- Aplikacja została utworzona przy użyciu bieżących szablonów, to znaczy, że zastosowano .
Aplikacje utworzone przy użyciu wcześniejszych szablonów, czyli przy użyciu metody , mogą włączyć stronę wyjątku dla deweloperów, wywołując metodę .
Ostrzeżenie
Nie włączaj strony wyjątków dewelopera, chyba że aplikacja jest uruchomiona w środowisku. Nie udostępniaj publicznie szczegółowych informacji o wyjątkach, gdy aplikacja działa w środowisku produkcyjnym. Aby uzyskać więcej informacji na temat konfigurowania środowisk, zobacz ASP.NET Core środowiska uruchomieniowe.
Strona wyjątku dewelopera może zawierać następujące informacje o wyjątku i żądaniu:
- Ślad stosu
- Parametry ciągu zapytania, jeśli istnieją
- Pliki cookie, jeśli istnieją
- Nagłówki
- Metadane punktu końcowego, jeśli istnieją
Strona wyjątków dla deweloperów nie gwarantuje, że poda jakiekolwiek informacje. Użyj logowania, aby uzyskać pełne informacje o błędzie.
Na poniższej ilustracji przedstawiono przykładową stronę wyjątków dla deweloperów z animacją pokazującą karty oraz prezentowane informacje.
Animowana strona wyjątku dla deweloperów, aby wyświetlić każdą wybraną kartę.
W odpowiedzi na żądanie z nagłówkiem HTTP, strona wyjątków dewelopera zwraca zwykły tekst zamiast HTML. Przykład:
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
- Minimalne interfejsy API
- Kontrolery
Aby wyświetlić stronę wyjątków dla deweloperów w Minimal API:
- Uruchom przykładową aplikację w środowisku.
- Przejdź do punktu końcowego .
W tej sekcji opisano następującą przykładową aplikację, aby zademonstrować sposoby obsługi wyjątków w minimalnym interfejsie API. Zgłasza wyjątek w przypadku żądania punktu końcowego :
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();
Mechanizm obsługi wyjątków
W środowiskach nieprodukcyjnych użyj Middleware obsługi wyjątków, aby wygenerować komunikat błędu.
- Minimalne interfejsy API
- Kontrolery
Aby skonfigurować metodę , wywołaj metodę . Na przykład, poniższy kod zmienia aplikację, aby odpowiadała klientowi ładunkiem zgodnym z RFC 7807. Aby uzyskać więcej informacji, zobacz sekcję Szczegóły problemu w dalszej części tego artykułu.
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();
Odpowiedzi na błędy klienta i serwera
- Minimalne API
- Kontrolery
Rozważmy następującą minimalną aplikację interfejsu API.
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);
Punkt końcowy tworzy z reprezentacją wartości , gdy jest większa niż , w przeciwnym razie kod stanu bez treści odpowiedzi. Aby uzyskać więcej informacji na temat tworzenia odpowiedzi, zobacz Tworzenie odpowiedzi w minimalnych aplikacjach interfejsu API.
Można je skonfigurować tak, aby tworzyła wspólną zawartość treści, gdy jest pusta, dla wszystkich odpowiedzi klienta HTTP () lub serwera (). Oprogramowanie pośredniczące jest konfigurowane przez wywołanie metody rozszerzenia UseStatusCodePages .
Na przykład w poniższym przykładzie zmienia się działanie aplikacji, aby odpowiadała za pomocą ładunku zgodnego ze specyfikacją RFC 7807 do klienta dla wszystkich odpowiedzi serwera i klienta, w tym błędy routingu (na przykład ). Aby uzyskać więcej informacji, zobacz sekcję Szczegóły problemu .
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);
Szczegóły problemu
Szczegóły problemu nie są jedynym formatem odpowiedzi opisujący błąd interfejsu API HTTP, jednak są one często używane do zgłaszania błędów dla interfejsów API HTTP.
Usługa szczegółów problemu implementuje interfejs IProblemDetailsService, który obsługuje tworzenie szczegółów problemu w ASP.NET Core. Metoda rozszerzenia w systemie rejestruje domyślną implementację.
W aplikacjach ASP.NET Core następujące middleware generuje szczegóły dotyczące problemów w odpowiedziach HTTP po wywołaniu AddProblemDetails, z wyjątkiem sytuacji, gdy nagłówek żądania HTTP Accept nie zawiera jednego z typów zawartości obsługiwanych przez zarejestrowany IProblemDetailsWriter (domyślnie: application/json):
- generuje odpowiedź z detalami problemu, gdy niestandardowa obsługa nie jest zdefiniowana.
- : domyślnie generuje odpowiedź ze szczegółami problemu.
- : generuje odpowiedź ze szczegółami problemu w środowisku programistycznym, gdy nagłówek żądania HTTP nie zawiera elementu .
- Minimalne interfejsy API
- Kontrolery
Minimalne aplikacje interfejsu API można skonfigurować do generowania odpowiedzi zawierających szczegóły problemu dla wszystkich błędów klienta HTTP i serwera, które jeszcze nie mają treści, przy użyciu metody rozszerzenia.
Poniższy kod konfiguruje aplikację w celu wygenerowania szczegółów problemu:
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);
Aby uzyskać więcej informacji na temat korzystania z programu , zobacz Szczegóły problemu
Zapasowa usługa IProblemDetailsService
W poniższym kodzie zwraca błąd, jeśli implementacja nie może wygenerować elementu :
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();
Poprzedni kod:
- Zapisuje komunikat o błędzie z kodem rezerwowym, jeśli program nie może napisać elementu . Na przykład punkt końcowy, w którym nagłówek żądania Accept określa typ nośnika, którego nie obsługuje.
- Używa pośrednika obsługi wyjątków.
Uwaga / Notatka
Obsługuje następujące typy mediów w nagłówku żądania:
application/jsonapplication/problem+json- Typy symboli wieloznacznych, takie jak i
Typy nośników innych niż JSON, takie jak lub , nie są obsługiwane i wyzwalają zachowanie rezerwowe.
Poniższy przykład jest podobny do powyższego z tą różnicą, że wywołuje metodę .
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);
Dodatkowe funkcje obsługi błędów
- Minimalne interfejsy API
- Kontrolery
Migracja z kontrolerów do minimalnych interfejsów API
Jeśli migrujesz z interfejsów API opartych na kontrolerach do minimalnych interfejsów API:
- Zastępowanie filtrów akcji filtrami punktów końcowych lub oprogramowaniem pośredniczącym
- Zamień walidację modelu na walidację ręczną lub powiązanie niestandardowe
- Zastępowanie filtrów wyjątków oprogramowaniem pośredniczącym obsługującym wyjątki
- Konfiguracja szczegółów problemu w celu uzyskania spójnych odpowiedzi na błędy
Kiedy należy używać obsługi błędów opartych na kontrolerze
W razie potrzeby rozważ użycie interfejsów API opartych na kontrolerze:
- Złożone scenariusze weryfikacji modelu
- Scentralizowana obsługa wyjątków na wielu kontrolerach
- Szczegółowa kontrola nad formatowaniem odpowiedzi na błędy
- Integracja z funkcjami MVC, takimi jak filtry i konwencje
Aby uzyskać więcej szczegółowych informacji na temat obsługi błędów opartych na kontrolerze, w tym błędów walidacji, dostosowywania szczegółów problemu i filtrów wyjątków, zapoznaj się z sekcjami w zakładce 'Kontrolery'.
Dodatkowe zasoby
- Jak użyć weryfikacji stanu modelu w internetowym interfejsie API ASP.NET Core
- View lub pobierz przykładowy kod
- Hellang.Middleware.ProblemDetails