Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi článku pro technologie .NET 10 najdete v
Výstraha
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v technologie .NET a technologie .NET základních zásadách podpory. Aktuální verzi článku pro technologie .NET 10 najdete v
- Minimální rozhraní API
- Řadiče
Tento článek popisuje, jak zpracovávat chyby v rozhraních API ASP.NET Core. Je vybraná dokumentace k minimálním rozhraním API. Pokud chcete zobrazit dokumentaci k rozhraním API založeným na kontroleru, vyberte kartu Controllers. Pokyny ke zpracování chyb Blazor najdete v tématu Chyba chyb v ASP.NET Core Blazor aplikacích.
Stránka výjimky pro vývojáře
Na stránce výjimka pro vývojáře se zobrazují podrobné informace o neošetřených výjimkách požadavků. Používá se k zaznamenání synchronních a asynchronních výjimek z kanálu HTTP a k vygenerování chybových odpovědí. Stránka pro vývojářské výjimky se spouští v rané fázi middleware kanálu, aby bylo možné zachytit neošetřené výjimky vyvolané v následujícím middleware.
ASP.NET Core aplikace ve výchozím nastavení povolí stránku výjimky vývojáře, pokud jsou splněny obě podmínky:
- Běží v prostředí.
- Aplikace byla vytvořena s aktuálními šablonami, tj. pomocí .
Aplikace vytvořené pomocí dřívějších šablon, tj. pomocí , mohou povolit stránku výjimky vývojáře voláním .
Výstraha
Nepovolujte stránku výjimky vývojáře , pokud aplikace není spuštěná v prostředí. Nesdílejte podrobné informace o výjimce veřejně, když aplikace běží v produkčním prostředí. Další informace o konfiguraci prostředí najdete v tématu ASP.NET Core runtime prostředí.
Stránka výjimky pro vývojáře může obsahovat následující informace o výjimce a požadavku:
- Trasování zásobníku
- Parametry řetězce dotazu, pokud nějaké
- Soubory cookie, pokud nějaké
- Headers
- Metadata koncového bodu, pokud existuje
Na stránce výjimky pro vývojáře není zaručeno, že poskytne jakékoli informace. Použijte protokolování pro získání úplných informací o chybě.
Následující obrázek ukazuje ukázkovou stránku s výjimkou pro vývojáře s animací, která zobrazuje karty a informace:
Stránka výjimky vývojáře animována pro zobrazení vybrané karty.
V reakci na požadavek s hlavičkou vrátí stránka výjimky vývojáře místo HTML prostý text. Například:
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
- Minimální rozhraní API
- Řadiče
Pokud chcete zobrazit stránku výjimky vývojáře v minimálním rozhraní API:
- Spusťte ukázkovou aplikaci v prostředí.
- Přejděte na koncový bod.
Tato část odkazuje na následující ukázkovou aplikaci, která demonstruje způsoby zpracování výjimek v minimálním rozhraní API. Při vyžádání koncového bodu dojde k výjimce:
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();
Obslužná rutina výjimky
V prostředích, která nejsou vývojová, použijte middleware pro zpracování výjimek k vytvoření chybového hlášení.
- Minimální rozhraní API
- Řadiče
Chcete-li provést konfiguraci, zavolejte na metodu. Například následující kód změní aplikaci tak, aby odpovídala klientovi s datovou částí ve formátu kompatibilním s RFC 7807. Další informace najdete v části Podrobnosti o problému dále v tomto článku.
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();
Odpovědi na chyby klienta a serveru
- Minimální rozhraní API
- Řadiče
Zvažte následující minimální aplikaci 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);
Koncový bod vytvoří reprezentaci, když je větší než , jinak vrátí stavový kód bez těla odpovědi. Další informace o vytvoření odpovědi najdete v tématu Vytváření odpovědí v minimálních aplikacích API.
Dá se nakonfigurovat tak, aby vytvářel společný základní obsah, pokud je prázdný, pro všechny odpovědi klienta HTTP () nebo serveru (). Middleware je nakonfigurován voláním rozšiřující metody UseStatusCodePages.
Následující příklad například změní aplikaci tak, aby reagovala na datovou část kompatibilní se standardem RFC 7807 pro klienta pro všechny odpovědi klienta a serveru, včetně chyb směrování (například ). Další informace najdete v části Podrobnosti o problému .
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);
Podrobnosti o problému
Podrobnosti o problému nejsou jediným formátem odpovědi, který popisuje chybu rozhraní HTTP API, ale běžně se používají k hlášení chyb pro rozhraní HTTP API.
Služba podrobností problému implementuje rozhraní IProblemDetailsService, které podporuje vytváření podrobností o problému v ASP.NET Core. Metoda rozšíření při registraci výchozí implementace.
V aplikacích ASP.NET Core následující middleware generuje odpovědi HTTP s podrobnostmi o problému, když je zavoláno AddProblemDetails, s výjimkou případů, kdy Accept HTTP hlavička požadavku neobsahuje jeden z typů obsahu podporovaných registrovaným IProblemDetailsWriter (výchozí: application/json):
- : Vygeneruje odpověď na podrobnosti o problému, pokud není definována vlastní obslužná rutina.
- : Ve výchozím nastavení vygeneruje odpověď podrobností o problému.
- : Vygeneruje odpověď na podrobnosti o problému při vývoji, pokud hlavička HTTP požadavku neobsahuje .
- Minimální rozhraní API
- Řadiče
Minimální aplikace API je možné nakonfigurovat tak, aby generovaly odpověď na podrobnosti o problému pro všechny odpovědi na chyby klienta HTTP a serveru, které ještě nemají základní obsah pomocí metody rozšíření.
Následující kód nakonfiguruje aplikaci tak, aby vygenerovala podrobnosti o problému:
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);
Další informace o použití naleznete v tématu Podrobnosti o problému.
Náhradní služba IProblemDetailsService
V následujícím kódu vrátí chybu, pokud implementace nemůže vygenerovat :
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();
Předchozí kód:
- Zapíše chybovou zprávu s náhradním kódem, pokud není schopen napsat . Například koncový bod, kde hlavička požadavku Accept určuje typ média, který server nepodporuje.
- Používá middleware pro obsluhu výjimek.
Poznámka:
V hlavičce požadavku podporuje následující typy médií:
application/jsonapplication/problem+json- Typy zástupných znaků, jako jsou například a
Typy médií bez formátu JSON, například nebo , nejsou podporovány a aktivují náhradní chování.
Následující ukázka je podobná té předchozí s tím rozdílem, že volá .
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);
Další funkce zpracování chyb
- Minimální rozhraní API
- Řadiče
Migrace z kontrolerů na minimální rozhraní API
Pokud migrujete z rozhraní API založených na kontroleru na minimální rozhraní API:
- Nahraďte filtry akcí filtry koncových bodů nebo middlewarem.
- Nahrazení validace modelu ručním ověřením nebo vlastní vazbou
- Nahrazení filtrů výjimek middlewarem zpracování výjimek
- Nakonfigurujte podrobnosti problémů pro konzistentní odpovědi na chyby
Kdy použít zpracování chyb na základě kontroleru
Pokud potřebujete, zvažte rozhraní API založená na kontroleru:
- Scénáře komplexního ověřování modelu
- Centralizované zpracování výjimek napříč několika kontrolery
- Jemně odstupňovaná kontrola nad formátováním odpovědí na chyby
- Integrace s funkcemi MVC, jako jsou filtry a konvence
Podrobné informace o zpracování chyb založené na kontrolerech, včetně chyb ověření, přizpůsobení detailů problému a výjimkových filtrů, najdete v sekcích záložky 'Kontrolery'.
Dodatečné zdroje
- Jak použít ověření ModelState ve webovém rozhraní API ASP.NET Core
- Zobrazit nebo stáhnout ukázkový kód
- Hellang.Middleware.ProblemDetails