Come gestire gli errori nell'API Web ASP.NET

L'API Web ASP.NET di Microsoft è un framework leggero che puoi utilizzare per creare servizi RESTful senza stato che vengono eseguiti su HTTP. Le eccezioni sono errori che si verificano in fase di runtime e la gestione delle eccezioni è la tecnica per gestire gli errori di runtime nel codice dell'applicazione.

Ogni sviluppatore di API Web ASP.NET dovrebbe sapere come gestire le eccezioni nell'API Web e come inviare codici di errore e messaggi di errore appropriati dai metodi del controller dell'API Web. Esamineremo come eseguire queste attività nelle sezioni seguenti. 

Utilizzo di HttpResponseException nell'API Web ASP.NET

È possibile utilizzare la classe HttpResponseException per restituire messaggi e codici di stato HTTP specifici dai metodi del controller nell'API Web. Ecco un esempio.

dipendente pubblico GetEmployee (int id)

{

    Employee emp = dipendenteRepository.Get (id);

    if (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("Il dipendente non esiste", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        lancia una nuova HttpResponseException (risposta);

    }

    return emp;

}

Se l'API Web restituisce IHttpActionResult, potresti voler scrivere il metodo GetEmployee come mostrato di seguito.

public IHttpActionResult GetEmployee (int id)

{

    Employee emp = dipendenteRepository.Get (id);

    if (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("Il dipendente non esiste", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        lancia una nuova HttpResponseException (risposta);

    }

    ritorno Ok (emp);

}

Si noti che il codice e il messaggio di errore vengono assegnati all'oggetto risposta e che viene restituita un'istanza di HttpResponseException quando si verifica un'eccezione nel metodo di azione del controller dell'API Web.

Utilizzo di HttpError nell'API Web ASP.NET

È possibile utilizzare il metodo di estensione CreateErrorResponse nel metodo del controller dell'API Web per restituire codici di errore e messaggi di errore significativi. Si noti che il metodo CreateErrorResponse crea un oggetto HttpError e quindi lo racchiude in un oggetto HttpResponseMessage.

Il listato di codice seguente illustra come utilizzare il metodo di estensione CreateErrorResponse dal metodo di azione del controller dell'API Web.

public IActionResult GetEmployee (int id)

{

    Employee emp = dipendenteRepository.Get (id);

    if (emp == null)

    {

       string message = "Il dipendente non esiste";

        lancia una nuova HttpResponseException (

            Request.CreateErrorResponse (HttpStatusCode.NotFound, message));

    }

    ritorno Ok (emp);

}

Fare riferimento al metodo GetEmployee () mostrato sopra. Questo metodo accetta un ID dipendente come parametro e utilizza questo ID per cercare e recuperare un record dipendente utilizzando l'istanza del repository dei dipendenti. Se non viene trovato un record dipendente con l'ID dipendente specificato, viene generata un'istanza di HttpResponseException. Notare come vengono creati il ​​messaggio di errore e il codice di errore appropriati prima che l'istanza di eccezione venga generata dal metodo del controller dell'API Web.

Utilizzo di filtri di eccezione nell'API Web ASP.NET

I filtri delle eccezioni sono filtri che possono essere utilizzati per gestire le eccezioni non gestite generate nei metodi del controller dell'API Web. In altre parole, è possibile utilizzare i filtri delle eccezioni per rilevare le eccezioni non gestite nell'API Web che hanno origine dai metodi del controller. Si noti che un filtro di errore globale è un buon approccio alla gestione delle eccezioni nell'API Web se le eccezioni non gestite vengono generate e non gestite nei metodi del controller.

Per creare un filtro di eccezione, è necessario implementare l'interfaccia IExceptionFilter. È inoltre possibile creare filtri di eccezione estendendo la classe astratta ExceptionFilterAttribute e quindi sovrascrivendo il metodo OnException. Si noti che la classe astratta ExceptionFilterAttribute a sua volta implementa l'interfaccia IExceptionFilter.

Il frammento di codice seguente illustra come creare un filtro di eccezione personalizzato estendendo la classe ExceptionFilterAttribute e quindi sovrascrivendo il metodo OnException. Notare come le eccezioni standard generate dai metodi del controller vengono acquisite dal filtro eccezioni personalizzato e quindi convertite in oggetti HttpStatusResponse con il codice HttpStatusCode appropriato.

classe pubblica CustomExceptionFilter: ExceptionFilterAttribute

    {

        public override void OnException (HttpActionExecutedContext actionExecutedContext)

        {

            HttpStatusCode status = HttpStatusCode.InternalServerError;

            Messaggio stringa = String.Empty;

            var exceptionType = actionExecutedContext.Exception.GetType ();

            if (exceptionType == typeof (UnauthorizedAccessException))

            {

                message = "L'accesso all'API Web non è autorizzato.";

                status = HttpStatusCode.Unauthorized;

            }

            altro se (exceptionType == typeof (DivideByZeroException))

            {

                message = "Errore interno del server.";

                status = HttpStatusCode.InternalServerError;

            }

            altro

            {

                messaggio = "Non trovato.";

                status = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = new HttpResponseMessage ()

            {

                Content = new StringContent (messaggio, System.Text.Encoding.UTF8, "text / plain"),

                StatusCode = status

            };

            base.OnException (actionExecutedContext);

        }

    }

È necessario aggiungere il filtro di eccezione personalizzato alla raccolta di filtri dell'oggetto HttpConfiguration.

registro void statico pubblico (configurazione HttpConfiguration)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                nome: "DefaultApi",

                routeTemplate: "api / {controller} / {id}",

                valori predefiniti: new {id = RouteParameter.Optional}

            );

            config.Formatters.Remove (config.Formatters.XmlFormatter);

            config.Filters.Add (new CustomExceptionFilter ());

        }

Puoi registrare i filtri delle eccezioni in uno dei tre modi seguenti:

  • A livello di azione
  • A livello di controller
  • Globalmente

Il frammento di codice seguente mostra come applicare un filtro a livello di azione, ovvero al metodo di azione del controller.

classe pubblica EmployeesController: ApiController

{

    [NotImplementedExceptionFilter]

    dipendente pubblico GetEmployee (int id)

    {

        lancia una nuova NotImplementedException ();

    }

}

Per applicare il filtro eccezioni a livello di controller, è necessario utilizzare l'attributo di filtro a livello di classe come mostrato di seguito.

[DatabaseExceptionFilter]

classe pubblica EmployeesController: ApiController

{

    // Un po 'di codice

}

È inoltre possibile applicare il filtro di eccezione personalizzato a livello globale in modo che funzioni per tutti i controller API Web. Ecco come puoi farlo.

GlobalConfiguration.Configuration.Filters.Add (new DatabaseExceptionFilterAttribute ());

Il frammento di codice seguente illustra come applicare il filtro di eccezione personalizzato creato in precedenza al metodo del controller.

[CustomExceptionFilter]

 public IEnumerable Get ()

 {

    lancia una nuova DivideByZeroException (); 

 }

L'API Web ASP.NET supporta l'uso di HttpResponseException per gestire le eccezioni sia a livello di controller che a livello di azione. Quando un metodo di azione nell'API Web genera un'eccezione non rilevata, l'eccezione viene tradotta in HTTP Status Code 500, ovvero "Errore interno del server". Se si utilizza HttpResponseException, è possibile specificare il codice di stato che si desidera restituire nel costruttore della classe HttpResponseException. In questo modo puoi personalizzare i tuoi codici di errore per renderli più significativi.

Come fare di più in ASP.NET e ASP.NET Core:

  • Come usare la memorizzazione nella cache in memoria in ASP.NET Core
  • Come gestire gli errori nell'API Web ASP.NET
  • Come passare più parametri ai metodi del controller dell'API Web
  • Come registrare i metadati di richieste e risposte nell'API Web ASP.NET
  • Come lavorare con HttpModules in ASP.NET
  • Controllo delle versioni avanzato nell'API Web ASP.NET Core
  • Come usare l'inserimento delle dipendenze in ASP.NET Core
  • Come lavorare con le sessioni in ASP.NET
  • Come lavorare con HTTPHandlers in ASP.NET
  • Come utilizzare IHostedService in ASP.NET Core
  • Come utilizzare un servizio SOAP WCF in ASP.NET Core
  • Come migliorare le prestazioni delle applicazioni ASP.NET Core
  • Come utilizzare un'API Web ASP.NET Core usando RestSharp
  • Come lavorare con la registrazione in ASP.NET Core
  • Come usare MediatR in ASP.NET Core
  • Come lavorare con lo stato della sessione in ASP.NET Core
  • Come utilizzare Nancy in ASP.NET Core
  • Comprendere l'associazione di parametri nell'API Web ASP.NET
  • Come caricare file in ASP.NET Core MVC
  • Come implementare la gestione delle eccezioni globale nell'API Web ASP.NET Core
  • Come implementare i controlli di integrità in ASP.NET Core
  • Procedure consigliate per la memorizzazione nella cache in ASP.NET
  • Come utilizzare la messaggistica Apache Kafka in .NET
  • Come abilitare CORS sulla tua API Web
  • Quando utilizzare WebClient vs. HttpClient vs. HttpWebRequest
  • Come lavorare con Redis Cache in .NET
  • Quando utilizzare Task.WaitAll rispetto a Task.WhenAll in .NET