339 votes

Pourquoi devrais-je utiliser IHttpActionResult à la place de HttpResponseMessage?

J'ai développé avec WebApi et j'ai ensuite migré vers 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. Il semble surtout fournir un moyen LÉGÈREMENT plus simple de créer un HttpResponseMessage.

Je soutiendrais 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 gagner 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 se sont nettement améliorées avec certains appels que j'ai faits : * Avec un exemple utilisant HttpResponseMessage, j'ai reçu la réponse en 9545 ms. * En utilisant le IHttpActionResult, j'ai reçu la même réponse en 294 ms.

0 votes

@chrislesage 9545 ms, c'est presque 10 secondes. Même 294 ms est assez lent. Si quelque chose prend plus de 100 ms, alors il y a autre chose en jeu. Il y a plus dans cette histoire qu'il n'y paraît.

6voto

Peter.Wang Points 1527

La Web API retourne essentiellement 4 types d'objets : void, HttpResponseMessage, IHttpActionResult, et d'autres types forts. La première version de la Web API retourne un HttpResponseMessage qui est un message de réponse HTTP assez direct.

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 de type fort sérialisées par la Web API à l'aide d'un formateur de média dans le corps de la réponse. L'inconvénient est que vous ne pouvez pas retourner directement un code d'erreur tel qu'un 404. Tout ce que vous pouvez faire est de lever 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 HttpRequest et _respContent est la charge utile.

3voto

Debendra Dash Points 1932

Nous avons les avantages suivants de l'utilisation de IHttpActionResult par rapport à HttpResponseMessage :

  1. En utilisant IHttpActionResult, nous nous concentrons uniquement sur les données à envoyer et non sur le code d'état. Ainsi, le code sera plus propre et très facile à maintenir.
  2. Le test unitaire de la méthode du contrôleur implémentée sera plus facile.
  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