Gestire gli errori in ASP.NET CoreHandle errors in ASP.NET Core

Di Kirk Larkin, Tom Dykstrae Steve SmithBy Kirk Larkin, Tom Dykstra, and Steve Smith

Questo articolo illustra gli approcci comuni per la gestione degli errori nelle app Web ASP.NET Core.This article covers common approaches to handling errors in ASP.NET Core web apps. Vedere Gestire gli errori nelle API Web di ASP.NET Core per le API Web.See Gestire gli errori nelle API Web di ASP.NET Core for web APIs.

Visualizzare o scaricare il codice di esempio.View or download sample code. (Come scaricare). La scheda rete di strumenti di sviluppo del browser F12 è utile quando si esegue il test dell'applicazione di esempio.(How to download.) The network tab on the F12 browser developer tools is useful when testing the sample app.

Pagina delle eccezioni per gli sviluppatoriDeveloper Exception Page

In Pagina delle eccezioni per gli sviluppatori sono disponibili informazioni dettagliate sulle eccezioni delle richieste.The Developer Exception Page displays detailed information about request exceptions. I modelli di ASP.NET Core generano il codice seguente:The ASP.NET Core templates generate the following code:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Il codice evidenziato precedente Abilita la pagina delle eccezioni per gli sviluppatori quando l'app è in esecuzione nell' ambiente di sviluppo.The preceding highlighted code enables the developer exception page when the app is running in the Development environment.

I modelli si posizionano all' UseDeveloperExceptionPage inizio della pipeline del middleware, in modo da poter intercettare le eccezioni generate nel middleware che segue.The templates place UseDeveloperExceptionPage early in the middleware pipeline so that it can catch exceptions thrown in middleware that follows.

Il codice precedente Abilita la pagina delle eccezioni per gli sviluppatori solo quando l'app è in esecuzione nell'ambiente di sviluppo.The preceding code enables the Developer Exception Page only when the app runs in the Development environment. Le informazioni dettagliate sulle eccezioni non devono essere visualizzate pubblicamente quando l'app viene eseguita nell'ambiente di produzione.Detailed exception information should not be displayed publicly when the app runs in the Production environment. Per altre informazioni sulla configurazione di ambienti, vedere Usare più ambienti in ASP.NET Core.For more information on configuring environments, see Usare più ambienti in ASP.NET Core.

La pagina delle eccezioni per sviluppatori include le informazioni seguenti sull'eccezione e la richiesta:The Developer Exception Page includes the following information about the exception and the request:

  • Analisi dello stackStack trace
  • Parametri della stringa di query se presentiQuery string parameters if any
  • Cookies se presenteCookies if any
  • IntestazioniHeaders

Pagina del gestore di eccezioniException handler page

Per configurare una pagina di gestione degli errori personalizzata per l' ambiente di produzione, chiamare UseExceptionHandler .To configure a custom error handling page for the Production environment, call UseExceptionHandler. Questo middleware di gestione delle eccezioni:This exception handling middleware:

  • Intercetta e registra le eccezioni.Catches and logs exceptions.
  • Esegue nuovamente la richiesta in una pipeline alternativa usando il percorso indicato.Re-executes the request in an alternate pipeline using the path indicated. La richiesta non viene eseguita nuovamente se la risposta è stata avviata.The request isn't re-executed if the response has started. Il codice generato dal modello esegue nuovamente la richiesta utilizzando il /Error percorso.The template generated code re-executes the request using the /Error path.

Nell'esempio seguente, UseExceptionHandler aggiunge il middleware di gestione delle eccezioni in ambienti non di sviluppo:In the following example, UseExceptionHandler adds the exception handling middleware in non-Development environments:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

Il Razor modello di app pagine fornisce una pagina di errore (cshtml) e una PageModel classe ( ErrorModel ) nella cartella pagine .The Razor Pages app template provides an Error page (.cshtml) and PageModel class (ErrorModel) in the Pages folder. Per un'app MVC, il modello di progetto include un Error metodo di azione e una visualizzazione degli errori per il controller Home.For an MVC app, the project template includes an Error action method and an Error view for the Home controller.

Non contrassegnare il metodo di azione del gestore errori con attributi di metodo HTTP, ad esempio HttpGet .Don't mark the error handler action method with HTTP method attributes, such as HttpGet. I verbi espliciti impediscono che alcune richieste raggiungano il metodo di azione.Explicit verbs prevent some requests from reaching the action method. Consentire l'accesso anonimo al metodo se gli utenti non autenticati dovrebbero visualizzare la visualizzazione degli errori.Allow anonymous access to the method if unauthenticated users should see the error view.

Accedere all'eccezioneAccess the exception

Utilizzare IExceptionHandlerPathFeature per accedere all'eccezione e al percorso della richiesta originale in un gestore degli errori.Use IExceptionHandlerPathFeature to access the exception and the original request path in an error handler. Il codice seguente aggiunge ExceptionMessage alle pagine predefinite /Error. cshtml. cs generate dai modelli di ASP.NET Core:The following code adds ExceptionMessage to the default Pages/Error.cshtml.cs generated by the ASP.NET Core templates:

[ResponseCache(Duration=0, Location=ResponseCacheLocation.None, NoStore=true)]
[IgnoreAntiforgeryToken]
public class ErrorModel : PageModel
{
    public string RequestId { get; set; }
    public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
    public string ExceptionMessage { get; set; }
    private readonly ILogger<ErrorModel> _logger;

    public ErrorModel(ILogger<ErrorModel> logger)
    {
        _logger = logger;
    }

    public void OnGet()
    {
        RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;

        var exceptionHandlerPathFeature =
        HttpContext.Features.Get<IExceptionHandlerPathFeature>();
        if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
        {
            ExceptionMessage = "File error thrown";
            _logger.LogError(ExceptionMessage);
        }
        if (exceptionHandlerPathFeature?.Path == "/index")
        {
            ExceptionMessage += " from home page";
        }
    }
}

Avviso

Non fornire informazioni sugli errori sensibili ai client.Do not serve sensitive error information to clients. Fornire informazioni sugli errori rappresenta un rischio di sicurezza.Serving errors is a security risk.

Per testare l'eccezione nell' app di esempio:To test the exception in the sample app:

  • Impostare l'ambiente sull'ambiente di produzione.Set the environment to production.
  • Rimuovere i commenti da webBuilder.UseStartup<Startup>(); in Program.cs.Remove the comments from webBuilder.UseStartup<Startup>(); in Program.cs.
  • Selezionare attiva un'eccezione nel Home page.Select Trigger an exception on the home page.

Espressione lambda per il gestore di eccezioniException handler lambda

Un'alternativa a una pagina di gestione delle eccezioni personalizzata consiste nel fornire un'espressione lambda a UseExceptionHandler.An alternative to a custom exception handler page is to provide a lambda to UseExceptionHandler. L'uso di un'espressione lambda consente l'accesso all'errore prima di restituire la risposta.Using a lambda allows access to the error before returning the response.

Il codice seguente usa un'espressione lambda per la gestione delle eccezioni:The following code uses a lambda for exception handling:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler(errorApp =>
        {
            errorApp.Run(async context =>
            {
                context.Response.StatusCode = 500;
                context.Response.ContentType = "text/html";

                await context.Response.WriteAsync("<html lang=\"en\"><body>\r\n");
                await context.Response.WriteAsync("ERROR!<br><br>\r\n");

                var exceptionHandlerPathFeature =
                    context.Features.Get<IExceptionHandlerPathFeature>();

                if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
                {
                    await context.Response.WriteAsync(
                                              "File error thrown!<br><br>\r\n");
                }

                await context.Response.WriteAsync(
                                              "<a href=\"/\">Home</a><br>\r\n");
                await context.Response.WriteAsync("</body></html>\r\n");
                await context.Response.WriteAsync(new string(' ', 512)); 
            });
        });
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Avviso

Non fornire informazioni sugli errori sensibili da IExceptionHandlerFeature o IExceptionHandlerPathFeature ai client.Do not serve sensitive error information from IExceptionHandlerFeature or IExceptionHandlerPathFeature to clients. Fornire informazioni sugli errori rappresenta un rischio di sicurezza.Serving errors is a security risk.

Per testare l'espressione lambda di gestione delle eccezioni nell' app di esempio:To test the exception handling lambda in the sample app:

  • Impostare l'ambiente sull'ambiente di produzione.Set the environment to production.
  • Rimuovere i commenti da webBuilder.UseStartup<StartupLambda>(); in Program.cs.Remove the comments from webBuilder.UseStartup<StartupLambda>(); in Program.cs.
  • Selezionare attiva un'eccezione nel Home page.Select Trigger an exception on the home page.

UseStatusCodePagesUseStatusCodePages

Per impostazione predefinita, un'app ASP.NET Core non fornisce una tabella codici di stato per i codici di stato di errore HTTP, ad esempio 404-non trovato.By default, an ASP.NET Core app doesn't provide a status code page for HTTP error status codes, such as 404 - Not Found. Quando l'app rileva una condizione di errore HTTP 400-499 che non ha un corpo, restituisce il codice di stato e un corpo della risposta vuoto.When the app encounters an HTTP 400-499 error condition that doesn't have a body, it returns the status code and an empty response body. Per specificare le tabelle codici di stato, usare il middleware tabelle codici di stato.To provide status code pages, use the status code pages middleware. Per abilitare i gestori di solo testo predefiniti per i codici di stato di errore comuni, chiamare UseStatusCodePages nel metodo Startup.Configure:To enable default text-only handlers for common error status codes, call UseStatusCodePages in the Startup.Configure method:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseStatusCodePages();

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Chiamare UseStatusCodePages prima del middleware di gestione delle richieste.Call UseStatusCodePages before request handling middleware. Ad esempio, chiamare UseStatusCodePages prima del middleware del file statico e del middleware degli endpoint.For example, call UseStatusCodePages before the Static File Middleware and the Endpoints Middleware.

Quando UseStatusCodePages non viene utilizzato, la navigazione a un URL senza un endpoint restituisce un messaggio di errore dipendente dal browser che indica che l'endpoint non è stato trovato.When UseStatusCodePages isn't used, navigating to a URL without an endpoint returns a browser dependent error message indicating the endpoint can't be found. Ad esempio, passando a Home/Privacy2 .For example, navigating to Home/Privacy2. Quando UseStatusCodePages viene chiamato il metodo, il browser restituisce:When UseStatusCodePages is called, the browser returns:

Status Code: 404; Not Found

UseStatusCodePages non viene in genere utilizzato nell'ambiente di produzione perché restituisce un messaggio che non è utile per gli utenti.UseStatusCodePages isn't typically used in production because it returns a message that isn't useful to users.

Per eseguire UseStatusCodePages il test nell' app di esempio:To test UseStatusCodePages in the sample app:

  • Impostare l'ambiente sull'ambiente di produzione.Set the environment to production.
  • Rimuovere i commenti da webBuilder.UseStartup<StartupUseStatusCodePages>(); in Program.cs.Remove the comments from webBuilder.UseStartup<StartupUseStatusCodePages>(); in Program.cs.
  • Selezionare i collegamenti nel home page home page.Select the links on the home page on the home page.

UseStatusCodePages con stringa di formatoUseStatusCodePages with format string

Per personalizzare il tipo di contenuto della risposta e il testo, usare l'overload di UseStatusCodePages che accetta un tipo di contenuto e una stringa di formato:To customize the response content type and text, use the overload of UseStatusCodePages that takes a content type and format string:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseStatusCodePages(
        "text/plain", "Status code page, status code: {0}");

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Nel codice precedente, {0} è un segnaposto per il codice di errore.In the preceding code, {0} is a placeholder for the error code.

UseStatusCodePages con una stringa di formato non viene in genere usata nell'ambiente di produzione perché restituisce un messaggio che non è utile per gli utenti.UseStatusCodePages with a format string isn't typically used in production because it returns a message that isn't useful to users.

Per eseguire UseStatusCodePages il test nell' app di esempio, rimuovere i commenti da webBuilder.UseStartup<StartupFormat>(); in Program.cs.To test UseStatusCodePages in the sample app, remove the comments from webBuilder.UseStartup<StartupFormat>(); in Program.cs.

UseStatusCodePages con espressione lambdaUseStatusCodePages with lambda

Per specificare la gestione degli errori personalizzata e il codice per la scrittura delle risposte, usare l'overload di UseStatusCodePages che accetta un'espressione lambda:To specify custom error-handling and response-writing code, use the overload of UseStatusCodePages that takes a lambda expression:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseStatusCodePages(async context =>
    {
        context.HttpContext.Response.ContentType = "text/plain";

        await context.HttpContext.Response.WriteAsync(
            "Status code page, status code: " +
            context.HttpContext.Response.StatusCode);
    });

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

UseStatusCodePages con un'espressione lambda non viene in genere usata nell'ambiente di produzione perché restituisce un messaggio che non è utile per gli utenti.UseStatusCodePages with a lambda isn't typically used in production because it returns a message that isn't useful to users.

Per eseguire UseStatusCodePages il test nell' app di esempio, rimuovere i commenti da webBuilder.UseStartup<StartupStatusLambda>(); in Program.cs.To test UseStatusCodePages in the sample app, remove the comments from webBuilder.UseStartup<StartupStatusLambda>(); in Program.cs.

UseStatusCodePagesWithRedirectsUseStatusCodePagesWithRedirects

Metodo di estensione UseStatusCodePagesWithRedirects:The UseStatusCodePagesWithRedirects extension method:

  • Invia un codice di stato 302 - Trovato al client.Sends a 302 - Found status code to the client.
  • Reindirizza il client all'endpoint di gestione degli errori fornito nel modello di URL.Redirects the client to the error handling endpoint provided in the URL template. Nell'endpoint di gestione degli errori vengono in genere visualizzate informazioni sull'errore e viene restituito il protocollo HTTP 200.The error handling endpoint typically displays error information and returns HTTP 200.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseStatusCodePagesWithRedirects("/MyStatusCode?code={0}");

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Il modello di URL può includere un {0} segnaposto per il codice di stato, come illustrato nel codice precedente.The URL template can include a {0} placeholder for the status code, as shown in the preceding code. Se il modello di URL inizia con ~ (tilde), ~ viene sostituito dall'app PathBase .If the URL template starts with ~ (tilde), the ~ is replaced by the app's PathBase. Quando si specifica un endpoint nell'app, creare una visualizzazione o una Razor pagina MVC per l'endpoint.When specifying an endpoint in the app, create an MVC view or Razor page for the endpoint. Per un Razor esempio di pagine, vedere pages/MyStatusCode. cshtml nell' app di esempio.For a Razor Pages example, see Pages/MyStatusCode.cshtml in the sample app.

Questo metodo viene usato comunemente quando l'app:This method is commonly used when the app:

  • Deve reindirizzare il client a un endpoint diverso, in genere nei casi in cui un'altra app elabora l'errore.Should redirect the client to a different endpoint, usually in cases where a different app processes the error. Per le app Web, la barra degli indirizzi del browser del client riflette l'endpoint reindirizzato.For web apps, the client's browser address bar reflects the redirected endpoint.
  • Non deve conservare e restituire il codice di stato originale con la risposta di reindirizzamento iniziale.Shouldn't preserve and return the original status code with the initial redirect response.

Per eseguire UseStatusCodePages il test nell' app di esempio, rimuovere i commenti da webBuilder.UseStartup<StartupSCredirect>(); in Program.cs.To test UseStatusCodePages in the sample app, remove the comments from webBuilder.UseStartup<StartupSCredirect>(); in Program.cs.

UseStatusCodePagesWithReExecuteUseStatusCodePagesWithReExecute

Metodo di estensione UseStatusCodePagesWithReExecute:The UseStatusCodePagesWithReExecute extension method:

  • Restituisce il codice di stato originale al client.Returns the original status code to the client.
  • Genera il corpo della risposta eseguendo nuovamente la pipeline delle richieste con un percorso alternativo.Generates the response body by re-executing the request pipeline using an alternate path.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseStatusCodePagesWithReExecute("/MyStatusCode2", "?code={0}");

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Se viene specificato un endpoint all'interno dell'app, creare una visualizzazione o una Razor pagina MVC per l'endpoint.If an endpoint within the app is specified, create an MVC view or Razor page for the endpoint. Assicurarsi UseStatusCodePagesWithReExecute che venga inserito prima UseRouting di in modo che sia possibile reindirizzare la richiesta alla pagina stato.Ensure UseStatusCodePagesWithReExecute is placed before UseRouting so the request can be rerouted to the status page. Per un Razor esempio di pagine, vedere pages/MyStatusCode2. cshtml nell' app di esempio.For a Razor Pages example, see Pages/MyStatusCode2.cshtml in the sample app.

Questo metodo viene usato comunemente quando l'app deve:This method is commonly used when the app should:

  • Elaborare la richiesta senza il reindirizzamento a un endpoint diverso.Process the request without redirecting to a different endpoint. Per le app Web, la barra degli indirizzi del browser del client riflette l'endpoint richiesto in origine.For web apps, the client's browser address bar reflects the originally requested endpoint.
  • Conservare e restituire il codice di stato originale con la risposta.Preserve and return the original status code with the response.

I modelli URL e stringa di query possono includere un segnaposto {0} per il codice di stato.The URL and query string templates may include a placeholder {0} for the status code. Il modello di URL deve iniziare con / .The URL template must start with /.

L'endpoint che elabora l'errore può ottenere l'URL originale che ha generato l'errore, come illustrato nell'esempio seguente:The endpoint that processes the error can get the original URL that generated the error, as shown in the following example:

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class MyStatusCode2Model : PageModel
{
    public string RequestId { get; set; }
    public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);

    public string ErrorStatusCode { get; set; }

    public string OriginalURL { get; set; }
    public bool ShowOriginalURL => !string.IsNullOrEmpty(OriginalURL);

    public void OnGet(string code)
    {
        RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
        ErrorStatusCode = code;

        var statusCodeReExecuteFeature = HttpContext.Features.Get<
                                               IStatusCodeReExecuteFeature>();
        if (statusCodeReExecuteFeature != null)
        {
            OriginalURL =
                statusCodeReExecuteFeature.OriginalPathBase
                + statusCodeReExecuteFeature.OriginalPath
                + statusCodeReExecuteFeature.OriginalQueryString;
        }
    }
}

Per un Razor esempio di pagine, vedere pages/MyStatusCode2. cshtml nell' app di esempio.For a Razor Pages example, see Pages/MyStatusCode2.cshtml in the sample app.

Per eseguire UseStatusCodePages il test nell' app di esempio, rimuovere i commenti da webBuilder.UseStartup<StartupSCreX>(); in Program.cs.To test UseStatusCodePages in the sample app, remove the comments from webBuilder.UseStartup<StartupSCreX>(); in Program.cs.

Disabilitare le tabelle codici di statoDisable status code pages

Per disabilitare le tabelle codici di stato per un controller MVC o un metodo di azione, usare l'attributo [SkipStatusCodePages].To disable status code pages for an MVC controller or action method, use the [SkipStatusCodePages] attribute.

Per disabilitare le tabelle codici di stato per richieste specifiche in un Razor metodo del gestore di pagine o in un controller MVC, usare IStatusCodePagesFeature :To disable status code pages for specific requests in a Razor Pages handler method or in an MVC controller, use IStatusCodePagesFeature:

public void OnGet()
{
    // using Microsoft.AspNetCore.Diagnostics;
    var statusCodePagesFeature = HttpContext.Features.Get<IStatusCodePagesFeature>();

    if (statusCodePagesFeature != null)
    {
        statusCodePagesFeature.Enabled = false;
    }
}

Codice di gestione delle eccezioniException-handling code

Anche il codice nelle pagine di gestione delle eccezioni può generare eccezioni.Code in exception handling pages can also throw exceptions. Le pagine di errore di produzione devono essere testate accuratamente e prestare particolare attenzione per evitare di generare eccezioni proprie.Production error pages should be tested thoroughly and take extra care to avoid throwing exceptions of their own.

Intestazioni di rispostaResponse headers

Dopo l'invio delle intestazioni per una risposta:Once the headers for a response are sent:

  • L'app non può modificare il codice di stato della risposta.The app can't change the response's status code.
  • Non è possibile eseguire pagine o gestori delle eccezioni.Any exception pages or handlers can't run. La risposta deve essere completata o la connessione deve essere interrotta.The response must be completed or the connection aborted.

Gestione delle eccezioni del serverServer exception handling

Oltre alla logica di gestione delle eccezioni in un'app, l' implementazione del server http può gestire alcune eccezioni.In addition to the exception handling logic in an app, the HTTP server implementation can handle some exceptions. Se il server rileva un'eccezione prima dell'invio delle intestazioni di risposta, il server invia una 500 - Internal Server Error risposta senza il corpo della risposta.If the server catches an exception before response headers are sent, the server sends a 500 - Internal Server Error response without a response body. Se il server rileva un'eccezione dopo l'invio delle intestazioni di risposta, il server chiude la connessione.If the server catches an exception after response headers are sent, the server closes the connection. Le richieste che non vengono gestite dall'app vengono gestite dal server.Requests that aren't handled by the app are handled by the server. Qualsiasi eccezione che si verifica quando il server sta gestendo la richiesta viene gestita dalla gestione delle eccezioni del server.Any exception that occurs when the server is handling the request is handled by the server's exception handling. Eventuali pagine di errore personalizzate dell'app, middleware di gestione delle eccezioni e filtri non hanno effetto su questo comportamento.The app's custom error pages, exception handling middleware, and filters don't affect this behavior.

Gestione delle eccezioni durante l'avvioStartup exception handling

Solo il livello di hosting può gestire le eccezioni che si verificano durante l'avvio dell'app.Only the hosting layer can handle exceptions that take place during app startup. L'host può essere configurato per acquisire gli errori di avvio e acquisire errori dettagliati.The host can be configured to capture startup errors and capture detailed errors.

Il livello di hosting può visualizzare una pagina di errore per un errore di avvio acquisito solo se l'errore si verifica dopo l'associazione indirizzo host/porta.The hosting layer can show an error page for a captured startup error only if the error occurs after host address/port binding. Se si verifica un errore di associazione:If binding fails:

  • Il livello di hosting registra un'eccezione critica.The hosting layer logs a critical exception.
  • Si verifica un arresto anomalo del processo di dotnet.The dotnet process crashes.
  • Non viene visualizzata alcuna pagina di errore quando il server HTTP è Kestrel.No error page is displayed when the HTTP server is Kestrel.

Se durante l'esecuzione in IIS (o servizio app di Azure) o in IIS Express il processo non può essere avviato, viene restituito l'errore 502.5 Errore del processo dal modulo ASP.NET Core.When running on IIS (or Azure App Service) or IIS Express, a 502.5 - Process Failure is returned by the ASP.NET Core Module if the process can't start. Per altre informazioni, vedere Risolvere i problemi relativi a ASP.NET Core in app Azure servizio e IIS.For more information, see Risolvere i problemi relativi a ASP.NET Core in app Azure servizio e IIS.

Pagina di errore di databaseDatabase error page

Il filtro eccezioni pagina sviluppatore database AddDatabaseDeveloperPageExceptionFilter acquisisce le eccezioni correlate al database che possono essere risolte utilizzando Entity Framework Core migrazioni.The Database developer page exception filter AddDatabaseDeveloperPageExceptionFilter captures database-related exceptions that can be resolved by using Entity Framework Core migrations. Quando si verificano queste eccezioni, viene generata una risposta HTML con i dettagli delle azioni possibili per risolvere il problema.When these exceptions occur, an HTML response is generated with details of possible actions to resolve the issue. Questa pagina è abilitata solo nell'ambiente di sviluppo.This page is enabled only in the Development environment. Il codice seguente è stato generato dal ASP.NET Core Razor modelli di pagine quando sono stati specificati singoli account utente:The following code was generated by the ASP.NET Core Razor Pages templates when individual user accounts were specified:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDatabaseDeveloperPageExceptionFilter();
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();
}

Filtri eccezioniException filters

Nelle app MVC i filtri delle eccezioni possono essere configurati a livello globale o per ogni controller o azione singolarmente.In MVC apps, exception filters can be configured globally or on a per-controller or per-action basis. Nelle Razor app Pages possono essere configurate a livello globale o per modello di pagina.In Razor Pages apps, they can be configured globally or per page model. Questi filtri gestiscono le eventuali eccezioni non gestite che si verificano durante l'esecuzione di un'azione del controller o di un altro filtro.These filters handle any unhandled exceptions that occur during the execution of a controller action or another filter. Per altre informazioni, vedere Filtri in ASP.NET Core.For more information, see Filtri in ASP.NET Core.

I filtri eccezioni sono utili per intercettare le eccezioni che si verificano all'interno di azioni MVC, ma non sono flessibili come il middleware di gestione delle eccezioniincorporato, UseExceptionHandler .Exception filters are useful for trapping exceptions that occur within MVC actions, but they're not as flexible as the built-in exception handling middleware, UseExceptionHandler. È consigliabile usare UseExceptionHandler , a meno che non sia necessario eseguire la gestione degli errori in modo diverso in base all'azione MVC scelta.We recommend using UseExceptionHandler, unless you need to perform error handling differently based on which MVC action is chosen.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Errori di stato del modelloModel state errors

Per informazioni su come gestire gli errori dello stato del modello, vedere Associazione di modelli e Convalida del modello.For information about how to handle model state errors, see Model binding and Model validation.

Risorse aggiuntiveAdditional resources

Di Tom Dykstrae Steve SmithBy Tom Dykstra, and Steve Smith

Questo articolo illustra gli approcci comuni per la gestione degli errori nelle app Web ASP.NET Core.This article covers common approaches to handling errors in ASP.NET Core web apps. Vedere Gestire gli errori nelle API Web di ASP.NET Core per le API Web.See Gestire gli errori nelle API Web di ASP.NET Core for web APIs.

Visualizzare o scaricare il codice di esempio.View or download sample code. (Come scaricare un esempio.)(How to download.)

Pagina delle eccezioni per gli sviluppatoriDeveloper Exception Page

In Pagina delle eccezioni per gli sviluppatori sono disponibili informazioni dettagliate sulle eccezioni delle richieste.The Developer Exception Page displays detailed information about request exceptions. I modelli di ASP.NET Core generano il codice seguente:The ASP.NET Core templates generate the following code:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

Il codice precedente Abilita la pagina delle eccezioni per gli sviluppatori quando l'app è in esecuzione nell' ambiente di sviluppo.The preceding code enables the developer exception page when the app is running in the Development environment.

I modelli si posizionano UseDeveloperExceptionPage prima di qualsiasi middleware, in modo che le eccezioni vengano rilevate nel middleware che segue.The templates place UseDeveloperExceptionPage before any middleware so exceptions are caught in the middleware that follows.

Il codice precedente Abilita la pagina delle eccezioni per gli sviluppatori solo quando l'app è in esecuzione nell'ambiente di sviluppo.The preceding code enables the Developer Exception Page only when the app is running in the Development environment. Le informazioni dettagliate sulle eccezioni non devono essere visualizzate pubblicamente quando l'app viene eseguita nell'ambiente di produzione.Detailed exception information should not be displayed publicly when the app runs in production. Per altre informazioni sulla configurazione di ambienti, vedere Usare più ambienti in ASP.NET Core.For more information on configuring environments, see Usare più ambienti in ASP.NET Core.

La pagina delle eccezioni per sviluppatori include le informazioni seguenti sull'eccezione e la richiesta:The Developer Exception Page includes the following information about the exception and the request:

  • Analisi dello stackStack trace
  • Parametri della stringa di query se presentiQuery string parameters if any
  • Cookies se presenteCookies if any
  • IntestazioniHeaders

Pagina del gestore di eccezioniException handler page

Per configurare una pagina di gestione degli errori personalizzata per l'ambiente di produzione, usare il middleware di gestione delle eccezioni.To configure a custom error handling page for the Production environment, use the Exception Handling Middleware. Il middleware:The middleware:

  • Intercetta e registra le eccezioni.Catches and logs exceptions.
  • Esegue nuovamente la richiesta in una pipeline alternativa per la pagina o il controller indicati.Re-executes the request in an alternate pipeline for the page or controller indicated. La richiesta non viene eseguita nuovamente se la risposta è stata avviata.The request isn't re-executed if the response has started. Il codice generato dal modello esegue nuovamente la richiesta a /Error .The template generated code re-executes the request to /Error.

Nell'esempio seguente UseExceptionHandler aggiunge il middleware di gestione delle eccezioni in ambienti non di sviluppo:In the following example, UseExceptionHandler adds the Exception Handling Middleware in non-Development environments:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

Il Razor modello di app pagine fornisce una pagina di errore (cshtml) e una PageModel classe ( ErrorModel ) nella cartella pagine .The Razor Pages app template provides an Error page (.cshtml) and PageModel class (ErrorModel) in the Pages folder. Per un'app MVC, il modello di progetto include un metodo di azione di errore e una visualizzazione degli errori nel controller Home.For an MVC app, the project template includes an Error action method and an Error view in the Home controller.

Non contrassegnare il metodo di azione del gestore errori con attributi di metodo HTTP, ad esempio HttpGet .Don't mark the error handler action method with HTTP method attributes, such as HttpGet. I verbi espliciti impediscono ad alcune richieste di raggiungere il metodo.Explicit verbs prevent some requests from reaching the method. Consentire l'accesso anonimo al metodo se gli utenti non autenticati dovrebbero visualizzare la visualizzazione degli errori.Allow anonymous access to the method if unauthenticated users should see the error view.

Accedere all'eccezioneAccess the exception

Usare IExceptionHandlerPathFeature per accedere all'eccezione e al percorso della richiesta originale in un controller o in una pagina del gestore degli errori:Use IExceptionHandlerPathFeature to access the exception and the original request path in an error handler controller or page:

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public class ErrorModel : PageModel
{
    public string RequestId { get; set; }
    public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
    public string ExceptionMessage { get; set; }

    public void OnGet()
    {
        RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;

        var exceptionHandlerPathFeature =
            HttpContext.Features.Get<IExceptionHandlerPathFeature>();
        if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
        {
            ExceptionMessage = "File error thrown";
        }
        if (exceptionHandlerPathFeature?.Path == "/index")
        {
            ExceptionMessage += " from home page";
        }
    }
}

Avviso

Non fornire informazioni sugli errori sensibili ai client.Do not serve sensitive error information to clients. Fornire informazioni sugli errori rappresenta un rischio di sicurezza.Serving errors is a security risk.

Per attivare la pagina di gestione delle eccezioni precedente, impostare l'ambiente sulle produzioni e forzare un'eccezione.To trigger the preceding exception handling page, set the environment to productions and force an exception.

Espressione lambda per il gestore di eccezioniException handler lambda

Un'alternativa a una pagina di gestione delle eccezioni personalizzata consiste nel fornire un'espressione lambda a UseExceptionHandler.An alternative to a custom exception handler page is to provide a lambda to UseExceptionHandler. L'uso di un'espressione lambda consente l'accesso all'errore prima di restituire la risposta.Using a lambda allows access to the error before returning the response.

Di seguito è riportato un esempio dell'uso di un'espressione lambda per la gestione delle eccezioni:Here's an example of using a lambda for exception handling:

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
   app.UseExceptionHandler(errorApp =>
   {
        errorApp.Run(async context =>
        {
            context.Response.StatusCode = 500;
            context.Response.ContentType = "text/html";

            await context.Response.WriteAsync("<html lang=\"en\"><body>\r\n");
            await context.Response.WriteAsync("ERROR!<br><br>\r\n");

            var exceptionHandlerPathFeature = 
                context.Features.Get<IExceptionHandlerPathFeature>();

            if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
            {
                await context.Response.WriteAsync("File error thrown!<br><br>\r\n");
            }

            await context.Response.WriteAsync("<a href=\"/\">Home</a><br>\r\n");
            await context.Response.WriteAsync("</body></html>\r\n");
            await context.Response.WriteAsync(new string(' ', 512)); // IE padding
        });
    });
    app.UseHsts();
}

Nel codice precedente await context.Response.WriteAsync(new string(' ', 512)); viene aggiunto, in modo che il browser Internet Explorer visualizzi il messaggio di errore anziché un messaggio di errore di IE.In the preceding code, await context.Response.WriteAsync(new string(' ', 512)); is added so the Internet Explorer browser displays the error message rather than an IE error message. Per altre informazioni, vedere questo problema di GitHub.For more information, see this GitHub issue.

Avviso

Non fornire informazioni sugli errori sensibili da IExceptionHandlerFeature o IExceptionHandlerPathFeature ai client.Do not serve sensitive error information from IExceptionHandlerFeature or IExceptionHandlerPathFeature to clients. Fornire informazioni sugli errori rappresenta un rischio di sicurezza.Serving errors is a security risk.

Per visualizzare il risultato dell'espressione lambda di gestione delle eccezioni nell'app di esempio, usare le direttive del preprocessore ProdEnvironment e ErrorHandlerLambda e selezionare Trigger an exception (Attiva un'eccezione) nella home page.To see the result of the exception handling lambda in the sample app, use the ProdEnvironment and ErrorHandlerLambda preprocessor directives, and select Trigger an exception on the home page.

UseStatusCodePagesUseStatusCodePages

Per impostazione predefinita, un'app ASP.NET Core non offre una tabella codici di stato per i codici di stato HTTP, ad esempio 404 - Non trovato.By default, an ASP.NET Core app doesn't provide a status code page for HTTP status codes, such as 404 - Not Found. L'app restituisce un codice di stato e un corpo della risposta vuoto.The app returns a status code and an empty response body. Per specificare le tabelle codici di stato, usare il middleware delle tabelle codici di stato.To provide status code pages, use Status Code Pages middleware.

Il middleware viene reso disponibile dal pacchetto Microsoft. AspNetCore. Diagnostics .The middleware is made available by the Microsoft.AspNetCore.Diagnostics package.

Per abilitare i gestori di solo testo predefiniti per i codici di stato di errore comuni, chiamare UseStatusCodePages nel metodo Startup.Configure:To enable default text-only handlers for common error status codes, call UseStatusCodePages in the Startup.Configure method:

app.UseStatusCodePages();

Chiamare UseStatusCodePages prima del middleware di gestione delle richieste (ad esempio, middleware dei file statici e middleware MVC).Call UseStatusCodePages before request handling middleware (for example, Static File Middleware and MVC Middleware).

Quando UseStatusCodePages non viene utilizzato, la navigazione a un URL senza un endpoint restituisce un messaggio di errore dipendente dal browser che indica che l'endpoint non è stato trovato.When UseStatusCodePages isn't used, navigating to a URL without an endpoint returns a browser dependent error message indicating the endpoint can't be found. Ad esempio, passando a Home/Privacy2 .For example, navigating to Home/Privacy2. Quando UseStatusCodePages viene chiamato il metodo, il browser restituisce:When UseStatusCodePages is called, the browser returns:

Status Code: 404; Not Found

UseStatusCodePages con stringa di formatoUseStatusCodePages with format string

Per personalizzare il tipo di contenuto della risposta e il testo, usare l'overload di UseStatusCodePages che accetta un tipo di contenuto e una stringa di formato:To customize the response content type and text, use the overload of UseStatusCodePages that takes a content type and format string:

app.UseStatusCodePages(
    "text/plain", "Status code page, status code: {0}");            

UseStatusCodePages con espressione lambdaUseStatusCodePages with lambda

Per specificare la gestione degli errori personalizzata e il codice per la scrittura delle risposte, usare l'overload di UseStatusCodePages che accetta un'espressione lambda:To specify custom error-handling and response-writing code, use the overload of UseStatusCodePages that takes a lambda expression:


app.UseStatusCodePages(async context =>
{
    context.HttpContext.Response.ContentType = "text/plain";

    await context.HttpContext.Response.WriteAsync(
        "Status code page, status code: " + 
        context.HttpContext.Response.StatusCode);
});

UseStatusCodePagesWithRedirectsUseStatusCodePagesWithRedirects

Metodo di estensione UseStatusCodePagesWithRedirects:The UseStatusCodePagesWithRedirects extension method:

  • Invia un codice di stato 302 - Trovato al client.Sends a 302 - Found status code to the client.
  • Reindirizza il client al percorso specificato nel modello di URL.Redirects the client to the location provided in the URL template.
app.UseStatusCodePagesWithRedirects("/StatusCode?code={0}");

Il modello di URL può includere un segnaposto {0} per il codice di stato, come illustrato nell'esempio.The URL template can include a {0} placeholder for the status code, as shown in the example. Se il modello di URL inizia con ~ (tilde), ~ viene sostituito dall'app PathBase .If the URL template starts with ~ (tilde), the ~ is replaced by the app's PathBase. Se si punta a un endpoint all'interno dell'app, creare una visualizzazione o una Razor pagina MVC per l'endpoint.If you point to an endpoint within the app, create an MVC view or Razor page for the endpoint. Per un Razor esempio di pagine, vedere pages/StatusCode. cshtml nell' app di esempio.For a Razor Pages example, see Pages/StatusCode.cshtml in the sample app.

Questo metodo viene usato comunemente quando l'app:This method is commonly used when the app:

  • Deve reindirizzare il client a un endpoint diverso, in genere nei casi in cui un'altra app elabora l'errore.Should redirect the client to a different endpoint, usually in cases where a different app processes the error. Per le app Web, la barra degli indirizzi del browser del client riflette l'endpoint reindirizzato.For web apps, the client's browser address bar reflects the redirected endpoint.
  • Non deve conservare e restituire il codice di stato originale con la risposta di reindirizzamento iniziale.Shouldn't preserve and return the original status code with the initial redirect response.

UseStatusCodePagesWithReExecuteUseStatusCodePagesWithReExecute

Metodo di estensione UseStatusCodePagesWithReExecute:The UseStatusCodePagesWithReExecute extension method:

  • Restituisce il codice di stato originale al client.Returns the original status code to the client.
  • Genera il corpo della risposta eseguendo nuovamente la pipeline delle richieste con un percorso alternativo.Generates the response body by re-executing the request pipeline using an alternate path.
app.UseStatusCodePagesWithReExecute("/StatusCode","?code={0}");

Se si punta a un endpoint all'interno dell'app, creare una visualizzazione o una Razor pagina MVC per l'endpoint.If you point to an endpoint within the app, create an MVC view or Razor page for the endpoint. Assicurarsi UseStatusCodePagesWithReExecute che venga inserito prima UseRouting di in modo che sia possibile reindirizzare la richiesta alla pagina stato.Ensure UseStatusCodePagesWithReExecute is placed before UseRouting so the request can be rerouted to the status page. Per un Razor esempio di pagine, vedere pages/StatusCode. cshtml nell' app di esempio.For a Razor Pages example, see Pages/StatusCode.cshtml in the sample app.

Questo metodo viene usato comunemente quando l'app deve:This method is commonly used when the app should:

  • Elaborare la richiesta senza il reindirizzamento a un endpoint diverso.Process the request without redirecting to a different endpoint. Per le app Web, la barra degli indirizzi del browser del client riflette l'endpoint richiesto in origine.For web apps, the client's browser address bar reflects the originally requested endpoint.
  • Conservare e restituire il codice di stato originale con la risposta.Preserve and return the original status code with the response.

I modelli di URL e di stringa di query potrebbero includere un segnaposto ({0}) per il codice di stato.The URL and query string templates may include a placeholder ({0}) for the status code. Il modello di URL deve iniziare con una barra (/).The URL template must start with a slash (/). Quando si usa un segnaposto nel percorso, verificare che l'endpoint (pagina o controller) possa elaborare il segmento del percorso.When using a placeholder in the path, confirm that the endpoint (page or controller) can process the path segment. Ad esempio, una Razor pagina per gli errori deve accettare il valore del segmento di percorso facoltativo con la @page direttiva:For example, a Razor Page for errors should accept the optional path segment value with the @page directive:

@page "{code?}"

L'endpoint che elabora l'errore può ottenere l'URL originale che ha generato l'errore, come illustrato nell'esempio seguente:The endpoint that processes the error can get the original URL that generated the error, as shown in the following example:

var statusCodeReExecuteFeature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
if (statusCodeReExecuteFeature != null)
{
    OriginalURL =
        statusCodeReExecuteFeature.OriginalPathBase
        + statusCodeReExecuteFeature.OriginalPath
        + statusCodeReExecuteFeature.OriginalQueryString;
}

Disabilitare le tabelle codici di statoDisable status code pages

Per disabilitare le tabelle codici di stato per un controller MVC o un metodo di azione, usare l' [SkipStatusCodePages] attributo.To disable status code pages for an MVC controller or action method, use the [SkipStatusCodePages] attribute.

Per disabilitare le tabelle codici di stato per richieste specifiche in un Razor metodo del gestore di pagine o in un controller MVC, usare IStatusCodePagesFeature :To disable status code pages for specific requests in a Razor Pages handler method or in an MVC controller, use IStatusCodePagesFeature:

var statusCodePagesFeature = HttpContext.Features.Get<IStatusCodePagesFeature>();

if (statusCodePagesFeature != null)
{
    statusCodePagesFeature.Enabled = false;
}

Codice di gestione delle eccezioniException-handling code

Il codice in pagine di gestione delle eccezioni può generare eccezioni.Code in exception handling pages can throw exceptions. È spesso consigliabile che le pagine di errore di produzione contengano esclusivamente contenuto statico.It's often a good idea for production error pages to consist of purely static content.

Intestazioni di rispostaResponse headers

Dopo l'invio delle intestazioni per una risposta:Once the headers for a response are sent:

  • L'app non può modificare il codice di stato della risposta.The app can't change the response's status code.
  • Non è possibile eseguire pagine o gestori delle eccezioni.Any exception pages or handlers can't run. La risposta deve essere completata o la connessione deve essere interrotta.The response must be completed or the connection aborted.

Gestione delle eccezioni del serverServer exception handling

Oltre alla logica di gestione delle eccezioni nell'app, l'implementazione del server HTTP può gestire alcune eccezioni.In addition to the exception handling logic in your app, the HTTP server implementation can handle some exceptions. Se rileva un'eccezione prima dell'invio delle intestazioni di risposta, il server invia una risposta 500 - Errore interno del server senza corpo.If the server catches an exception before response headers are sent, the server sends a 500 - Internal Server Error response without a response body. Se il server rileva un'eccezione dopo l'invio delle intestazioni di risposta, il server chiude la connessione.If the server catches an exception after response headers are sent, the server closes the connection. Le richieste che non sono gestite dall'app vengono gestite dal server.Requests that aren't handled by your app are handled by the server. Qualsiasi eccezione che si verifica quando il server sta gestendo la richiesta viene gestita dalla gestione delle eccezioni del server.Any exception that occurs when the server is handling the request is handled by the server's exception handling. Eventuali pagine di errore personalizzate dell'app, middleware di gestione delle eccezioni e filtri non hanno effetto su questo comportamento.The app's custom error pages, exception handling middleware, and filters don't affect this behavior.

Gestione delle eccezioni durante l'avvioStartup exception handling

Solo il livello di hosting può gestire le eccezioni che si verificano durante l'avvio dell'app.Only the hosting layer can handle exceptions that take place during app startup. L'host può essere configurato per acquisire gli errori di avvio e acquisire errori dettagliati.The host can be configured to capture startup errors and capture detailed errors.

Il livello di hosting può visualizzare una pagina di errore per un errore di avvio acquisito solo se l'errore si verifica dopo l'associazione indirizzo host/porta.The hosting layer can show an error page for a captured startup error only if the error occurs after host address/port binding. Se si verifica un errore di associazione:If binding fails:

  • Il livello di hosting registra un'eccezione critica.The hosting layer logs a critical exception.
  • Si verifica un arresto anomalo del processo di dotnet.The dotnet process crashes.
  • Non viene visualizzata alcuna pagina di errore quando il server HTTP è Kestrel.No error page is displayed when the HTTP server is Kestrel.

Se durante l'esecuzione in IIS (o servizio app di Azure) o in IIS Express il processo non può essere avviato, viene restituito l'errore 502.5 Errore del processo dal modulo ASP.NET Core.When running on IIS (or Azure App Service) or IIS Express, a 502.5 - Process Failure is returned by the ASP.NET Core Module if the process can't start. Per altre informazioni, vedere Risolvere i problemi relativi a ASP.NET Core in app Azure servizio e IIS.For more information, see Risolvere i problemi relativi a ASP.NET Core in app Azure servizio e IIS.

Pagina di errore di databaseDatabase error page

Il middleware della pagina di errore del database acquisisce le eccezioni correlate al database che possono essere risolte tramite Entity Framework migrazioni.Database Error Page Middleware captures database-related exceptions that can be resolved by using Entity Framework migrations. Quando si verificano queste eccezioni, viene generata una risposta HTML con i dettagli delle azioni possibili per risolvere il problema.When these exceptions occur, an HTML response with details of possible actions to resolve the issue is generated. Questa pagina deve essere abilitata solo nell'ambiente di sviluppo.This page should be enabled only in the Development environment. Abilitare la pagina aggiungendo codice Startup.Configure:Enable the page by adding code to Startup.Configure:

if (env.IsDevelopment())
{
    app.UseDatabaseErrorPage();
}

UseDatabaseErrorPage richiede il pacchetto NuGet Microsoft. AspNetCore. Diagnostics. EntityFrameworkCore .UseDatabaseErrorPage requires the Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore NuGet package.

Filtri eccezioniException filters

Nelle app MVC i filtri delle eccezioni possono essere configurati a livello globale o per ogni controller o azione singolarmente.In MVC apps, exception filters can be configured globally or on a per-controller or per-action basis. Nelle Razor app Pages possono essere configurate a livello globale o per modello di pagina.In Razor Pages apps, they can be configured globally or per page model. Questi filtri gestiscono tutte le eccezioni non gestite che si verificano durante l'esecuzione di un'azione del controller o di un altro filtroThese filters handle any unhandled exception that occurs during the execution of a controller action or another filter. Per altre informazioni, vedere Filtri in ASP.NET Core.For more information, see Filtri in ASP.NET Core.

Suggerimento

I filtri delle eccezioni sono utili per intercettare le eccezioni che si verificano all'interno di azioni MVC, ma non sono flessibili come il middleware di gestione degli errori.Exception filters are useful for trapping exceptions that occur within MVC actions, but they're not as flexible as the Exception Handling Middleware. È consigliabile usare il middleware.We recommend using the middleware. Usare i filtri solo quando è necessario eseguire la gestione degli errori in modo diverso in base all'azione MVC scelta.Use filters only where you need to perform error handling differently based on which MVC action is chosen.

Errori di stato del modelloModel state errors

Per informazioni su come gestire gli errori dello stato del modello, vedere Associazione di modelli e Convalida del modello.For information about how to handle model state errors, see Model binding and Model validation.

Risorse aggiuntiveAdditional resources