Come gestire gli errori 404 in ASP.NET Core MVC

ASP.NET Core MVC è la controparte .NET Core del framework ASP.NET MVC per la creazione di applicazioni Web e API multipiattaforma, scalabili e ad alte prestazioni utilizzando il modello di progettazione Model-View-Controller. Sorprendentemente, sebbene ASP.NET Core offra molte opzioni per la gestione degli errori 404 con grazia, il runtime ASP.NET Core MVC non ne sfrutta i vantaggi per impostazione predefinita.

Di conseguenza, quando una pagina Web non viene trovata e viene restituito un errore 404 dall'applicazione, ASP.NET Core MVC presenta solo una pagina di errore del browser generico (come illustrato nella Figura 1 di seguito). Questo articolo illustra tre opzioni in ASP.NET Core che possiamo usare per gestire gli errori 404 in modo più regolare.

Per lavorare con gli esempi di codice forniti in questo articolo, dovresti avere Visual Studio 2019 installato nel tuo sistema. Se non hai già una copia, puoi scaricare Visual Studio 2019 qui.

Creare un progetto ASP.NET Core MVC

Prima di tutto, creiamo un progetto ASP.NET Core in Visual Studio. Supponendo che Visual Studio 2019 sia installato nel sistema, seguire i passaggi descritti di seguito per creare un nuovo progetto ASP.NET Core in Visual Studio.

  1. Avvia l'IDE di Visual Studio.
  2. Fai clic su "Crea nuovo progetto".
  3. Nella finestra "Crea nuovo progetto", seleziona "Applicazione Web ASP.NET Core" dall'elenco dei modelli visualizzati.
  4. Fare clic su Avanti. 
  5. Nella finestra "Configura il tuo nuovo progetto" mostrata di seguito, specifica il nome e la posizione per il nuovo progetto.
  6. Fare clic su Crea.
  7. Nella finestra "Crea una nuova applicazione Web ASP.NET Core", seleziona .NET Core come runtime e ASP.NET Core 3.1 (o successivo) dall'elenco a discesa in alto.
  8. Selezionare "Applicazione Web (Model-View-Controller)" come modello di progetto per creare una nuova applicazione ASP.NET Core MVC.
  9. Assicurati che le caselle di controllo "Abilita supporto Docker" e "Configura per HTTPS" siano deselezionate poiché non utilizzeremo queste funzionalità qui.
  10. Assicurati che l'autenticazione sia impostata su "Nessuna autenticazione" poiché non utilizzeremo nemmeno l'autenticazione.
  11. Fare clic su Crea.

Seguendo questi passaggi verrà creato un nuovo progetto ASP.NET Core MVC in Visual Studio 2019. Useremo questo progetto per illustrare le nostre opzioni di gestione degli errori 404 nelle sezioni successive di questo articolo.

Quando esegui il progetto ASP.NET Core MVC che abbiamo creato nella sezione precedente, vedrai la home page dell'applicazione insieme al messaggio di benvenuto come mostrato nella Figura 1 di seguito. 

Ora proviamo a sfogliare una pagina web che non esiste. Per fare ciò, digita // localhost: 6440 / welcome nella barra degli indirizzi del tuo browser mentre l'applicazione è in esecuzione. Quando il motore ASP.NET Core MVC non riesce a individuare la risorsa per l'URL specificato, verrà restituito un errore 404 e verrà visualizzata la seguente pagina di errore. Non è molto elegante, vero?

Controllare Response.StatusCode in ASP.NET Core MVC

Esistono diversi modi per migliorare questa pagina di errore generica. Una soluzione semplice è controllare il codice di stato HTTP 404 nella risposta. Se lo trovi, puoi reindirizzare il controllo a una pagina esistente. Il frammento di codice seguente illustra come scrivere il codice necessario nel metodo Configure della classe Startup per reindirizzare alla home page se si è verificato un errore 404.

 app.Use (async (context, next) =>

    {

        attende il prossimo ();

        if (context.Response.StatusCode == 404)

        {

            context.Request.Path = "/ Home";

            attende il prossimo ();

        }

    });

Ora se esegui l'applicazione e provi a esplorare l'URL // localhost: 6440 / welcome, verrai reindirizzato alla home page dell'applicazione.

Il codice completo del metodo Configure è fornito di seguito come riferimento.

public void Configure (app IApplicationBuilder, IWebHostEnvironment env)

        {

            if (env.IsDevelopment ())

            {

                app.UseDeveloperExceptionPage ();

            }

            altro

            {

                app.UseExceptionHandler ("/ Home / Error");

            }

            app.Use (async (context, next) =>

            {

                attende il prossimo ();

                if (context.Response.StatusCode == 404)

                {

                    context.Request.Path = "/ Home";

                    attende il prossimo ();

                }

            });

            app.UseStaticFiles ();

            app.UseRouting ();

            app.UseAuthorization ();

            app.UseEndpoints (endpoint =>

            {

                endpoints.MapControllerRoute (

                    nome: "predefinito",

                    pattern: "{controller = Home} / {action = Index} / {id?}");

            });

        }

Usa il middleware UseStatusCodePages in ASP.NET Core MVC

Una seconda soluzione per la gestione degli errori 404 in ASP.NET Core consiste nell'usare il middleware UseStatusCodePages incorporato. Il frammento di codice seguente mostra come implementare StatusCodePages nel metodo Configure della classe Startup.

public void Configure (app IApplicationBuilder, IWebHostEnvironment env)

        {

            app.UseStatusCodePages ();

            // Altro codice

        }

Ora, quando si esegue l'applicazione e si passa alla risorsa inesistente, l'output sarà simile alla Figura 3.

Usa il middleware UseStatusCodePagesWithReExecute in ASP.NET Core MVC

È possibile sfruttare il middleware UseStatusCodePagesWithReExecute per gestire i codici di stato non riusciti nei casi in cui il processo di generazione della risposta non è stato avviato. Quindi questo middleware non gestirà gli errori del codice di stato HTTP 404, piuttosto, quando si verifica un errore 404, il controllo verrà passato a un'altra azione del controller per gestire l'errore.

Il frammento di codice seguente illustra come utilizzare questo middleware per reindirizzare a un altro metodo di azione.

app.UseStatusCodePagesWithReExecute ("/ Home / HandleError / {0}");

Ecco come sarebbe il metodo di azione.

[Route ("/ Home / HandleError / {code: int}")]

public IActionResult HandleError (int code)

{

   ViewData ["ErrorMessage"] = $ "Si è verificato un errore. Il ErrorCode è: {code}";

   return View ("~ / Views / Shared / HandleError.cshtml");

}

Lascio a te la creazione della vista HandleError per visualizzare il messaggio di errore.

Infine, potresti voler creare viste specifiche per un codice di errore. Ad esempio, potresti creare visualizzazioni come Home / Error / 500.cshtml o Home / Error / 404.cshtml. È quindi possibile controllare il codice di errore HTTP e reindirizzare alla pagina di errore appropriata.

Ancora un altro modo per gestire gli errori di pagina non trovata è utilizzare una visualizzazione personalizzata e impostare il codice di errore in modo appropriato. Quando si verifica un errore nell'applicazione, è possibile reindirizzare l'utente alla pagina di errore appropriata e visualizzare il messaggio di errore personalizzato che descrive l'errore.

Come fare di più in ASP.NET Core:

  • Come usare l'inserimento delle dipendenze nei filtri di azione in ASP.NET Core 3.1
  • Come usare il modello di opzioni in ASP.NET Core
  • Come usare il routing degli endpoint in ASP.NET Core 3.0 MVC
  • Come esportare dati in Excel in ASP.NET Core 3.0
  • Come usare LoggerMessage in ASP.NET Core 3.0
  • Come inviare messaggi di posta elettronica in ASP.NET Core
  • Come registrare i dati in SQL Server in ASP.NET Core
  • Come pianificare i processi utilizzando Quartz.NET in ASP.NET Core
  • Come restituire dati dall'API Web ASP.NET Core
  • Come formattare i dati di risposta in ASP.NET Core
  • Come utilizzare un'API Web ASP.NET Core usando RestSharp
  • Come eseguire operazioni asincrone utilizzando Dapper
  • Come usare i flag di funzionalità in ASP.NET Core
  • Come utilizzare l'attributo FromServices in ASP.NET Core
  • Come lavorare con i cookie in ASP.NET Core
  • Come lavorare con file statici in ASP.NET Core
  • Come usare il middleware di riscrittura degli URL in ASP.NET Core
  • Come implementare la limitazione della velocità in ASP.NET Core
  • Come usare Azure Application Insights in ASP.NET Core
  • Utilizzo di funzionalità NLog avanzate in ASP.NET Core
  • Come gestire gli errori nell'API Web ASP.NET
  • Come implementare la gestione delle eccezioni globale in ASP.NET Core MVC
  • Come gestire i valori null in ASP.NET Core MVC
  • Controllo delle versioni avanzato nell'API Web ASP.NET Core
  • Come lavorare con i servizi di lavoro in ASP.NET Core
  • Come utilizzare l'API di protezione dei dati in ASP.NET Core
  • Come usare il middleware condizionale in ASP.NET Core
  • Come lavorare con lo stato della sessione in ASP.NET Core
  • Come scrivere controller efficienti in ASP.NET Core