Comment gérer les erreurs dans l'API Web ASP.NET

L'API Web ASP.NET de Microsoft est une infrastructure légère que vous pouvez utiliser pour créer des services RESTful sans état qui s'exécutent sur HTTP. Les exceptions sont des erreurs qui se produisent au moment de l'exécution, et la gestion des exceptions est la technique de gestion des erreurs d'exécution dans le code de votre application.

Chaque développeur d'API Web ASP.NET doit savoir comment gérer les exceptions dans l'API Web et comment envoyer les codes d'erreur et les messages d'erreur appropriés à partir des méthodes de contrôleur d'API Web. Nous examinerons comment effectuer ces tâches dans les sections ci-dessous. 

Utilisation de HttpResponseException dans l'API Web ASP.NET

Vous pouvez utiliser la classe HttpResponseException pour renvoyer des codes d'état HTTP et des messages spécifiques à partir de vos méthodes de contrôleur dans l'API Web. Voici un exemple.

public Employee GetEmployee (int id)

{

    Employé emp = employeeRepository.Get (id);

    si (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("L'employé n'existe pas", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        throw new HttpResponseException (réponse);

    }

    return emp;

}

Si votre API Web renvoie IHttpActionResult, vous souhaiterez peut-être écrire la méthode GetEmployee comme indiqué ci-dessous.

public IHttpActionResult GetEmployee (identifiant int)

{

    Employé emp = employeeRepository.Get (id);

    si (emp == null)

    {

        var response = new HttpResponseMessage (HttpStatusCode.NotFound)

        {

            Content = new StringContent ("L'employé n'existe pas", System.Text.Encoding.UTF8, "text / plain"),

            StatusCode = HttpStatusCode.NotFound

        }

        throw new HttpResponseException (réponse);

    }

    retournez Ok (emp);

}

Notez que le code d'erreur et le message d'erreur sont affectés à l'objet de réponse et qu'une instance de HttpResponseException est renvoyée lorsqu'une exception se produit dans la méthode d'action du contrôleur d'API Web.

Utilisation de HttpError dans l'API Web ASP.NET

Vous pouvez utiliser la méthode d'extension CreateErrorResponse dans votre méthode de contrôleur API Web pour renvoyer des codes d'erreur et des messages d'erreur significatifs. Notez que la méthode CreateErrorResponse crée un objet HttpError, puis l'enveloppe dans un objet HttpResponseMessage.

La liste de codes suivante illustre comment vous pouvez utiliser la méthode d'extension CreateErrorResponse à partir de la méthode d'action de votre contrôleur d'API Web.

public IActionResult GetEmployee (int id)

{

    Employé emp = employeeRepository.Get (id);

    si (emp == null)

    {

       string message = "L'employé n'existe pas";

        lancer une nouvelle HttpResponseException (

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

    }

    retournez Ok (emp);

}

Reportez-vous à la méthode GetEmployee () ci-dessus. Cette méthode accepte un ID d'employé en tant que paramètre et utilise cet ID pour rechercher et récupérer un enregistrement d'employé à l'aide de l'instance de référentiel d'employés. Si un enregistrement d'employé ayant l'ID d'employé spécifié n'est pas trouvé, une instance de HttpResponseException est levée. Notez comment le message d'erreur et le code d'erreur appropriés sont construits avant que l'instance d'exception ne soit levée à partir de la méthode du contrôleur API Web.

Utilisation de filtres d'exception dans l'API Web ASP.NET

Les filtres d'exception sont des filtres qui peuvent être utilisés pour gérer les exceptions non gérées qui sont générées dans vos méthodes de contrôleur d'API Web. En d'autres termes, vous pouvez utiliser des filtres d'exception pour intercepter les exceptions non gérées dans l'API Web qui proviennent de vos méthodes de contrôleur. Notez qu'un filtre d'erreur global est une bonne approche pour gérer les exceptions dans votre API Web si des exceptions non gérées sont levées et non gérées dans vos méthodes de contrôleur.

Pour créer un filtre d'exception, vous devez implémenter l'interface IExceptionFilter. Vous pouvez également créer des filtres d'exception en étendant la classe abstraite ExceptionFilterAttribute, puis en remplaçant la méthode OnException. Notez que la classe abstraite ExceptionFilterAttribute implémente à son tour l'interface IExceptionFilter.

L'extrait de code suivant illustre comment vous pouvez créer un filtre d'exception personnalisé en étendant la classe ExceptionFilterAttribute, puis en remplaçant la méthode OnException. Notez comment les exceptions standard levées par vos méthodes de contrôleur sont capturées par le filtre d'exception personnalisé, puis converties en objets HttpStatusResponse avec le HttpStatusCode approprié.

classe publique CustomExceptionFilter: ExceptionFilterAttribute

    {

        public override void OnException (HttpActionExecutedContext actionExecutedContext)

        {

            HttpStatusCode status = HttpStatusCode.InternalServerError;

            Message de chaîne = String.Empty;

            var exceptionType = actionExecutedContext.Exception.GetType ();

            if (exceptionType == typeof (UnauthorizedAccessException))

            {

                message = "L'accès à l'API Web n'est pas autorisé.";

                status = HttpStatusCode.Unauthorized;

            }

            else if (exceptionType == typeof (DivideByZeroException))

            {

                message = "Erreur de serveur interne.";

                status = HttpStatusCode.InternalServerError;

            }

            autre

            {

                message = "Non trouvé.";

                status = HttpStatusCode.NotFound;

            }

            actionExecutedContext.Response = nouveau HttpResponseMessage ()

            {

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

                StatusCode = statut

            };

            base.OnException (actionExecutedContext);

        }

    }

Vous devez ajouter le filtre d'exception personnalisé à la collection de filtres de l'objet HttpConfiguration.

Registre public static void (configuration HttpConfiguration)

        {

            config.MapHttpAttributeRoutes ();

            config.Routes.MapHttpRoute (

                nom: "DefaultApi",

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

                par défaut: new {id = RouteParameter.Optional}

            );

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

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

        }

Vous pouvez enregistrer vos filtres d'exception de l'une des trois manières suivantes:

  • Au niveau de l'action
  • Au niveau du contrôleur
  • Globalement

L'extrait de code suivant montre comment vous pouvez appliquer un filtre au niveau de l'action, c'est-à-dire à la méthode d'action de votre contrôleur.

public class EmployeesController: ApiController

{

    [NotImplementedExceptionFilter]

    public Employee GetEmployee (int id)

    {

        throw new NotImplementedException ();

    }

}

Pour appliquer le filtre d'exception au niveau du contrôleur, vous devez utiliser l'attribut de filtre au niveau de la classe, comme indiqué ci-dessous.

[DatabaseExceptionFilter]

public class EmployeesController: ApiController

{

    // Un peu de code

}

Vous pouvez également appliquer globalement votre filtre d'exception personnalisé afin qu'il fonctionne pour tous les contrôleurs d'API Web. Voici comment procéder.

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

L'extrait de code suivant illustre comment vous pouvez appliquer le filtre d'exception personnalisé que nous avons créé précédemment à votre méthode de contrôleur.

[CustomExceptionFilter]

 public IEnumerable Get ()

 {

    lancer une nouvelle exception DivideByZeroException (); 

 }

L'API Web ASP.NET prend en charge l'utilisation de HttpResponseException pour gérer les exceptions à la fois au niveau du contrôleur et au niveau de l'action. Lorsqu'une méthode d'action dans l'API Web lève une exception non interceptée, l'exception est traduite en code d'état HTTP 500, c'est-à-dire «Erreur de serveur interne». Si vous utilisez HttpResponseException, vous pouvez spécifier le code d'état que vous souhaitez renvoyer dans le constructeur de la classe HttpResponseException. De cette façon, vous pouvez personnaliser vos codes d'erreur pour les rendre plus significatifs.

Comment faire plus dans ASP.NET et ASP.NET Core:

  • Comment utiliser la mise en cache en mémoire dans ASP.NET Core
  • Comment gérer les erreurs dans l'API Web ASP.NET
  • Comment passer plusieurs paramètres aux méthodes du contrôleur API Web
  • Comment consigner les métadonnées de demande et de réponse dans l'API Web ASP.NET
  • Comment travailler avec HttpModules dans ASP.NET
  • Contrôle de version avancé dans l'API Web ASP.NET Core
  • Comment utiliser l'injection de dépendances dans ASP.NET Core
  • Comment travailler avec des sessions dans ASP.NET
  • Comment travailler avec HTTPHandlers dans ASP.NET
  • Comment utiliser IHostedService dans ASP.NET Core
  • Comment consommer un service SOAP WCF dans ASP.NET Core
  • Comment améliorer les performances des applications ASP.NET Core
  • Comment consommer une API Web ASP.NET Core à l'aide de RestSharp
  • Comment travailler avec la journalisation dans ASP.NET Core
  • Comment utiliser MediatR dans ASP.NET Core
  • Comment travailler avec l'état de session dans ASP.NET Core
  • Comment utiliser Nancy dans ASP.NET Core
  • Comprendre la liaison de paramètres dans l'API Web ASP.NET
  • Comment télécharger des fichiers dans ASP.NET Core MVC
  • Comment implémenter la gestion globale des exceptions dans l'API Web ASP.NET Core
  • Comment implémenter les vérifications de l'état dans ASP.NET Core
  • Meilleures pratiques de mise en cache dans ASP.NET
  • Comment utiliser la messagerie Apache Kafka dans .NET
  • Comment activer CORS sur votre API Web
  • Quand utiliser WebClient vs HttpClient vs HttpWebRequest
  • Comment travailler avec Redis Cache dans .NET
  • Quand utiliser Task.WaitAll par rapport à Task.WhenAll dans .NET