web-dev-qa-db-fra.com

Méthode recommandée pour la gestion des erreurs avec l'API Web ASP.NET

Pourriez-vous préciser quelle est la meilleure pratique en matière de gestion des erreurs de l'API Web? En fait, je ne sais pas si c'est une bonne pratique d'utiliser essayer de saisir ma demande d'API.

public Vb.Order PostOrderItem(Vb.Order order)
{
    if (OAuth.isValid(Request.Headers.GetValues("Token").Single()) != true)
    {
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized);
        throw new HttpResponseException(httpResponseMessage);
    }
    if (!ModelState.IsValid)
    {
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest);
        throw new HttpResponseException(httpResponseMessage);
    }

    try
    {
        return Vb.Document.Generate(order);
    }
    catch (Exception ex)
    {
        logger.Error(ex);
        HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest);
        httpResponseMessage.Content = new StringContent(ex.Message);
        throw new HttpResponseException(httpResponseMessage);
    }

}

J'ai l'impression que l'utilisation de try sur un code côté serveur n'est pas une bonne pratique, car je viens de connecter mon catch et de relancer une exception.

17
Bastien Vandamme

La gestion des erreurs dans les API Web est considérée comme une préoccupation transversale et doit être placée ailleurs dans le pipeline afin que les développeurs n'aient pas besoin de se concentrer sur les préoccupations transversales.

Vous devriez lire/ Gestion des exceptions dans l’API Web ASP.NET

Que se passe-t-il si un contrôleur API Web génère une exception non interceptée? Par Par défaut, la plupart des exceptions sont traduites en une réponse HTTP avec code d'état 500, Erreur interne du serveur.

et aussi Traitement des erreurs globales dans ASP.NET Web API 2

Vous devriez essayer de garder votre contrôleur maigre autant que possible. La gestion des erreurs, comme votre code d'origine, n'entraînera qu'une duplication du code et des préoccupations inutiles que les développeurs ne doivent pas ignorer. Les développeurs doivent se concentrer sur la préoccupation principale et non sur les préoccupations transversales. En nous concentrant simplement sur le problème principal, le code ci-dessus ressemblera à ceci: 

[MyAuthentication]
[MyValidateModel]
public Vb.Order PostOrderItem(Vb.Order order)
{    
    return Vb.Document.Generate(order);
}

Pourquoi si maigre?

Parce que :

if (OAuth.isValid(Request.Headers.GetValues("Token").Single()) != true)
{
    HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.Unauthorized);
    throw new HttpResponseException(httpResponseMessage);
}

peut être déplacé dans Filtres d’authentification dans l’API Web ASP.NET 2 qui peut être appliqué localement sur le contrôleur/action ou globalement pour renvoyer une réponse pertinente.

Validation de modèle dans l'API Web ASP.NET comme ça 

if (!ModelState.IsValid)
{
    HttpResponseMessage httpResponseMessage = new HttpResponseMessage(HttpStatusCode.BadRequest);
    throw new HttpResponseException(httpResponseMessage);
}

Peut aussi être déplacé dans un filtre comme:.

public class MyValidateModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (!actionContext.ModelState.IsValid)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(
                HttpStatusCode.BadRequest, actionContext.ModelState);
        }
    }
}
28
Nkosi

Veuillez vous référer à ce lien Gestion des exceptions dans l’API Web ASP.NET - Visite guidée . Il existe un pipeline de traitement des exceptions à 4 niveaux:

  • Niveau 1 - HttpResponseException
  • Niveau 2 - Filtres d'exception
  • Niveau 3 - Exploitation forestière
  • Niveau 4 - Gestionnaires d'exception

Les API Web nous offrent une grande flexibilité en termes de gestion des exceptions. Récapituler:

  • Utilisez HttpResponseException ou les méthodes de raccourci pour traiter les exceptions non gérées au niveau action.
  • Utilisez les filtres d'exception pour gérer des exceptions particulières non gérées sur plusieurs actions et contrôleurs.
  • Utilisez ExceptionLogger pour consigner toute exception non gérée.
  • Utilisez des gestionnaires d'exception (un par application) pour traiter toute exception non gérée à l'échelle de l'application.
17
Phuc Thai

Il y a un certain nombre de méthodes, chacune augmentant le graphe d'objets logiques;

Cet article les répertorie tous. http://www.codeproject.com/Articles/850062/Exception-handling-in-ASP-NET-MVC-methods-explaine

Je trouve utile d’utiliser une des méthodes de niveau supérieur afin d’éviter les doublons de code.

0
Milney