339 votes

Pourquoi devrais-je utiliser IHttpActionResult plutôt que HttpResponseMessage ?

J'ai développé avec WebApi et suis passé à WebApi2 où Microsoft a introduit une nouvelle interface IHttpActionResult qui semble être recommandée d'être utilisée plutôt que de retourner un HttpResponseMessage. Je suis confus sur les avantages de cette nouvelle interface. Elle semble principalement fournir un moyen LÉGÈREMENT plus facile de créer un HttpResponseMessage.

Je pourrais argumenter que c'est "de l'abstraction pour l'abstraction". Est-ce que je rate quelque chose? Quels sont les avantages concrets que j'obtiens en utilisant cette nouvelle interface, à part peut-être économiser une ligne de code?

Ancienne méthode (WebApi):

public HttpResponseMessage Delete(int id)
{
    var status = _Repository.DeleteCustomer(id);
    if (status)
    {
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
    else
    {
        throw new HttpResponseException(HttpStatusCode.NotFound);
    }
}

Nouvelle méthode (WebApi2):

public IHttpActionResult Delete(int id)
{
    var status = _Repository.DeleteCustomer(id);
    if (status)
    {
        //return new HttpResponseMessage(HttpStatusCode.OK);
        return Ok();
    }
    else
    {
        //throw new HttpResponseException(HttpStatusCode.NotFound);
        return NotFound();
    }
}

1 votes

Je viens de trouver quelque chose d'intéressant. Je ne suis pas sûr si ces résultats peuvent être vérifiés par quelqu'un d'autre. Mais les performances ont beaucoup augmenté avec certaines appels que j'ai faits : * Avec un exemple utilisant HttpResponseMessage j'ai reçu la réponse en 9545 ms. * En utilisant IHttpActionResult j'ai obtenu la même réponse en 294 ms.

0 votes

@chrislesage 9545 ms est presque 10 secondes. Même 294 ms est assez lent. Si vous avez quelque chose prenant plus de 100 ms alors quelque chose d'autre est à l'œuvre là-bas. Il y a plus à cette histoire qu'il n'y paraît.

6voto

Peter.Wang Points 1527

L'API Web renvoie principalement 4 types d'objet : void, HttpResponseMessage, IHttpActionResult, et d'autres types forts. La première version de l'API Web renvoie HttpResponseMessage qui est un message de réponse HTTP assez simple.

Le IHttpActionResult a été introduit par WebAPI 2 qui est une sorte d'enveloppe de HttpResponseMessage. Il contient la méthode ExecuteAsync() pour créer un HttpResponseMessage. Cela simplifie les tests unitaires de votre contrôleur.

D'autres types de retour sont des classes typées fortes sérialisées par l'API Web à l'aide d'un formateur de médias dans le corps de la réponse. L'inconvénient est que vous ne pouvez pas renvoyer directement un code d'erreur tel qu'un 404. Tout ce que vous pouvez faire est de provoquer une erreur HttpResponseException.

3voto

appletwo Points 1128

Je préfère implémenter la fonction de l'interface TaskExecuteAsync pour IHttpActionResult. Quelque chose comme :

    public Task ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = _request.CreateResponse(HttpStatusCode.InternalServerError, _respContent);

        switch ((Int32)_respContent.Code)
        { 
            case 1:
            case 6:
            case 7:
                response = _request.CreateResponse(HttpStatusCode.InternalServerError, _respContent);
                break;
            case 2:
            case 3:
            case 4:
                response = _request.CreateResponse(HttpStatusCode.BadRequest, _respContent);
                break;
        } 

        return Task.FromResult(response);
    }

, où _request est la requête HTTP et _respContent est la charge utile.

3voto

Debendra Dash Points 1932

Nous avons les avantages suivants d'utiliser IHttpActionResult au lieu de HttpResponseMessage:

  1. En utilisant IHttpActionResult, nous nous concentrons uniquement sur les données à envoyer, pas sur le code d'état. Ainsi, le code sera plus propre et très facile à maintenir.
  2. Les tests unitaires de la méthode du contrôleur implémenté seront plus faciles.
  3. Utilise async et await par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X