Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 10 di questo articolo.
Avvertimento
Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere .NET e .NET Core Support Policy. Per la versione corrente, vedere la versione .NET 10 di questo articolo.
Questo articolo descrive come gestire gli errori nelle API di ASP.NET Core. È selezionata la documentazione relativa alle API minime. Per visualizzare la documentazione per le API basate su controller, selezionare la scheda Controllers. Per indicazioni sulla gestione degli errori, vedere Blazor.
Pagina Eccezioni per sviluppatori
Nella pagina Eccezioni sviluppatore vengono visualizzate informazioni dettagliate sulle eccezioni di richiesta non gestite. Usa DeveloperExceptionPageMiddleware per acquisire eccezioni sincrone e asincrone dalla pipeline HTTP e per generare risposte di errore. La pagina delle eccezioni dello sviluppatore viene eseguita all'inizio della pipeline del middleware, in modo che possa rilevare eccezioni non gestite generate nel middleware successivo.
Le app di ASP.NET Core abilitano la pagina delle eccezioni per sviluppatori per impostazione predefinita quando entrambe le condizioni sono vere:
- Esecuzione nell'ambiente di
Development. - L'app è stata creata con i modelli correnti, ovvero usando WebApplication.CreateBuilder.
Le app create usando i modelli precedenti, ovvero usando WebHost.CreateDefaultBuilder, possono abilitare la pagina delle eccezioni per sviluppatori chiamando app.UseDeveloperExceptionPage.
Avvertimento
Non abilitare la pagina eccezioni per sviluppatori a meno che l'app non sia in esecuzione nell'ambienteDevelopment. Non condividere pubblicamente informazioni dettagliate sulle eccezioni quando l'app viene eseguita nell'ambiente di produzione. Per ulteriori informazioni sulla configurazione degli ambienti, vedere ambiente di esecuzione ASP.NET Core.
La pagina Delle eccezioni per sviluppatori può includere le informazioni seguenti sull'eccezione e sulla richiesta:
- Analisi dello stack
- Parametri della stringa di query, se presenti
- Cookie, se presenti
- Headers
- Metadati dell'endpoint, se presenti
La pagina Delle eccezioni per gli sviluppatori non fornisce alcuna informazione. Usare Registrazione per informazioni complete sull'errore.
L'immagine seguente mostra una pagina di eccezioni per sviluppatori di esempio con animazione per visualizzare le schede e le informazioni visualizzate:
In risposta a una richiesta con un'intestazione Accept: text/plain , la pagina eccezioni sviluppatore restituisce testo normale anziché HTML. Per esempio:
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
Per visualizzare la pagina Delle eccezioni per sviluppatori in un'API minima:
- Eseguire l'applicazione di esempio nell'ambiente
Development. - Passare all'endpoint
/exception.
Questa sezione fa riferimento all'app di esempio seguente per illustrare i modi per gestire le eccezioni in un'API minima. Genera un'eccezione quando viene richiesto l'endpoint /exception :
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();
Gestore eccezioni
Negli ambienti diversi da quelli di sviluppo, usare il middleware per la gestione delle eccezioni per produrre un payload di errore.
Per configurare Exception Handler Middleware, chiamare UseExceptionHandler. Ad esempio, il codice seguente modifica l'app per rispondere con un payload conforme a RFC 7807 al client. Per altre informazioni, vedere la sezione Dettagli problema più avanti in questo articolo.
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();
Risposte di errore del client e del server
Si consideri la seguente app per API minimale.
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);
L'endpoint /users restituisce 200 OK con una rappresentazione json di User quando id è maggiore di 0, altrimenti un codice di stato 400 BAD REQUEST senza corpo della risposta. Per altre informazioni sulla creazione di una risposta, vedere Creare risposte nelle app per le API minime.
Status Code Pages middleware Può essere configurato per produrre un contenuto del corpo predefinito comune, quando è vuoto, per tutte le risposte del client HTTP (400-499) o del server (500 -599). Il middleware viene configurato chiamando il metodo di estensione UseStatusCodePages .
Ad esempio, l'esempio seguente modifica l'app in modo che risponda con un payload conforme a RFC 7807 al client per tutte le risposte client e server, inclusi gli errori di routing (ad esempio, 404 NOT FOUND). Per altre informazioni, vedere la sezione Dettagli problema .
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);
Dettagli del problema
I dettagli del problema non sono l'unico formato di risposta per descrivere un errore dell'API HTTP, ma vengono comunemente usati per segnalare errori per le API HTTP.
Il servizio dettagli problema implementa l'interfaccia IProblemDetailsService, che supporta la creazione di dettagli del problema in ASP.NET Core. Il AddProblemDetails(IServiceCollection) metodo di estensione in IServiceCollection registra l'implementazione predefinita IProblemDetailsService .
Nelle app ASP.NET Core, il seguente middleware genera risposte HTTP con dettagli sul problema quando viene chiamato AddProblemDetails, tranne quando l'intestazione HTTP della richiesta Accept non include uno dei tipi di contenuto supportati dal IProblemDetailsWriter registrato (predefinito: application/json):
- ExceptionHandlerMiddleware: genera una risposta ai dettagli del problema quando un gestore personalizzato non è definito.
- StatusCodePagesMiddleware: genera una risposta ai dettagli del problema per impostazione predefinita.
-
DeveloperExceptionPageMiddleware: genera una risposta ai dettagli del problema durante lo sviluppo quando l'intestazione HTTP della
Acceptrichiesta non includetext/html.
Le app Minimal API possono essere configurate per generare una risposta con i dettagli del problema per tutte le risposte di errore HTTP del client e del server che non contengono ancora un corpo tramite il metodo di estensione AddProblemDetails.
Il codice seguente configura l'app per generare i dettagli del problema:
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);
Per ulteriori informazioni sull'uso di AddProblemDetails, vedere Dettagli del problema
Fallback IProblemDetailsService
Nel codice seguente restituisce httpContext.Response.WriteAsync("Fallback: An error occurred.") un errore se l'implementazione IProblemDetailsService non è in grado di generare :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();
Il codice precedente:
- Scrive un messaggio di errore con il codice di fallback se
problemDetailsServicenon è in grado di scrivere unProblemDetails. Ad esempio, un endpoint in cui l'intestazione della richiesta Accept specifica un tipo di contenuto multimediale cheDefaultProblemDetailsWriternon supporta. - Usa il middleware di gestione delle eccezioni.
Annotazioni
DefaultProblemDetailsWriter supporta i seguenti tipi di contenuto nell'intestazione della richiesta Accept:
application/jsonapplication/problem+json- Tipi con caratteri jolly, ad
*/*esempio eapplication/*
I tipi di contenuto non JSON, come application/xml o text/html, non sono supportati e attivano il comportamento di ripiego.
L'esempio seguente è simile al precedente, tranne per il fatto che chiama il 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);
Funzionalità aggiuntive per la gestione degli errori
Migrazione da Controller a API minime
Se si esegue la migrazione dalle API basate su controller alle API minime:
- Sostituire i filtri di azione con filtri di endpoint o middleware
- Sostituire la convalida del modello con la convalida manuale o l'associazione personalizzata
- Sostituire i filtri delle eccezioni con il middleware di gestione delle eccezioni
-
Configurare i dettagli del problema usando
AddProblemDetails()per risposte di errore coerenti
Quando usare la gestione degli errori basata su controller
Se necessario, prendere in considerazione le API basate su controller:
- Scenari di convalida dei modelli complessi
- Gestione centralizzata delle eccezioni tra più controller
- Controllo granulare sulla formattazione della risposta di errore
- Integrazione con funzionalità MVC come filtri e convenzioni
Per informazioni dettagliate sulla gestione degli errori basata sul controller, inclusi gli errori di convalida, la personalizzazione dei dettagli del problema e i filtri delle eccezioni, vedere le sezioni della scheda Controller .