J'ai développé avec WebApi et je suis passé à WebApi2 où Microsoft a introduit une nouvelle IHttpActionResult
interface qui semble être recommandée plutôt que de renvoyer un HttpResponseMessage
. Je suis confus sur les avantages de cette nouvelle interface. Il semble principalement fournir simplement un moyen légèrement plus facile de créer un fichierHttpResponseMessage
.
Je dirais que c'est "l'abstraction pour l'abstraction". Suis-je en train de manquer quelque chose? Quels sont les avantages réels que j'obtiens de l'utilisation de cette nouvelle interface, à part peut-être la sauvegarde d'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 façon (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();
}
}
c#
asp.net-web-api
httpresponse
Jason Roell
la source
la source
HttpResponseMessage
j'ai obtenu la réponse en 9545 ms . * En utilisant le,IHttpActionResult
j'ai obtenu la même réponse en 294 ms .Réponses:
Vous pouvez décider de ne pas l'utiliser,
IHttpActionResult
car votre code existant génère unHttpResponseMessage
qui ne correspond pas à l'une des réponses prédéfinies. Vous pouvez cependant vous adapterHttpResponseMessage
à l'IHttpActionResult
utilisation de la réponse standardisée deResponseMessage
. Il m'a fallu un certain temps pour comprendre cela, j'ai donc voulu le poster montrant que vous n'avez pas nécessairement à choisir l'un ou l'autre:Remarque,
ResponseMessage
est une méthode de la classe de baseApiController
dont votre contrôleur doit hériter.la source
ResponseMessage
et ceResponseMessageResult
sont deux choses différentes.ResponseMessage()
est une méthode deApiController
laquelle votre contrôleur doit hériter de, et est donc un simple appel de méthode. Donc, aucunnew
mot-clé n'est nécessaire là-bas. Vous n'héritez probablement pasApiController
ou vous êtes dans une méthode statique.ResponseMessageResult
est le type de retour deResponseMessage()
.response = base.ResponseMessage(responseMsg)
pour préciser que c'est une méthode de la classe de base ApiControllerVous pouvez toujours utiliser
HttpResponseMessage
. Cette capacité ne disparaîtra pas. J'ai ressenti la même chose que vous et j'ai longuement argumenté avec l'équipe qu'il n'y avait pas besoin d'une abstraction supplémentaire. Il y a eu quelques arguments pour essayer de justifier son existence, mais rien ne m'a convaincu que cela en valait la peine.Autrement dit, jusqu'à ce que je vois cet échantillon de Brad Wilson . Si vous construisez des
IHttpActionResult
classes d'une manière qui peut être enchaînée, vous gagnez la possibilité de créer un pipeline de réponse de "niveau action" pour générer leHttpResponseMessage
. Sous les couvertures, voici commentActionFilters
sont implémentées cependant, l'ordre de celles-ciActionFilters
n'est pas évident lors de la lecture de la méthode d'action, ce qui est une des raisons pour lesquelles je ne suis pas un fan des filtres d'action.Cependant, en créant un
IHttpActionResult
qui peut être explicitement enchaîné dans votre méthode d'action, vous pouvez composer toutes sortes de comportements différents pour générer votre réponse.la source
Voici plusieurs avantages de
IHttpActionResult
plusHttpResponseMessage
mentionnés dans la documentation Microsoft ASP.Net :Mais voici quelques autres avantages de l'utilisation qui
IHttpActionResult
méritent d'être mentionnés:Ok
NotFound
Exception
Unauthorized
BadRequest
Conflict
Redirect
InvalidModelState
( lien vers la liste complète )ExecuteAsync
méthode.ResponseMessageResult ResponseMessage(HttpResponseMessage response)
pour convertir HttpResponseMessage en IHttpActionResult .la source
la source
Ceci est juste mon opinion personnelle et les gens de l'équipe d'API Web peuvent probablement mieux l'articuler, mais voici mon 2c.
Tout d'abord, je pense que ce n'est pas une question de l'un sur l'autre. Vous pouvez les utiliser à la fois en fonction de ce que vous voulez faire dans votre méthode d'action , mais pour comprendre la puissance réelle de
IHttpActionResult
, vous devrez probablement pas en dehors de ces méthodes d'assistance pratique deApiController
tels queOk
,NotFound
, etc.Fondamentalement, je pense qu'une classe implémentant
IHttpActionResult
comme une usine deHttpResponseMessage
. Avec cet état d'esprit, il devient maintenant un objet qui doit être retourné et une usine qui le produit. Dans le sens général de la programmation, vous pouvez créer l'objet vous-même dans certains cas et dans certains cas, vous avez besoin d'une usine pour le faire. Pareil ici.Si vous souhaitez renvoyer une réponse qui doit être construite à travers une logique complexe, par exemple de nombreux en-têtes de réponse, etc., vous pouvez résumer toute cette logique dans une classe de résultats d'action implémentant
IHttpActionResult
et l'utiliser dans plusieurs méthodes d'action pour renvoyer la réponse.Un autre avantage de l'utilisation
IHttpActionResult
comme type de retour est qu'il rend la méthode d'action de l'API Web ASP.NET similaire à MVC. Vous pouvez renvoyer n'importe quel résultat d'action sans vous faire prendre dans les formateurs de médias.Bien sûr, comme l'a noté Darrel, vous pouvez enchaîner les résultats d'actions et créer un micro-pipeline puissant similaire aux gestionnaires de messages eux-mêmes dans le pipeline d'API. Vous en aurez besoin en fonction de la complexité de votre méthode d'action.
Bref, ce n'est pas
IHttpActionResult
contreHttpResponseMessage
. Fondamentalement, c'est la façon dont vous souhaitez créer la réponse. Faites-le vous-même ou dans une usine.la source
ResponseFactory.CreateOkResponse()
celle qui retournent HttpResponseMessage, et je n'ai pas eu à faire face au truc asynchrone lors de la création de la réponse. Un membre de l'équipe a mentionné le fait que l'async peut être utile si vous devez effectuer des E / S afin de générer des valeurs d'en-tête. Je ne sais pas combien de fois cela se produit.L'API Web renvoie essentiellement 4 type d'objet:
void
,HttpResponseMessage
,IHttpActionResult
et d' autres types forts. La première version de l'API Web renvoieHttpResponseMessage
ce qui est un message de réponse HTTP assez simple.Le a
IHttpActionResult
été introduit par WebAPI 2 qui est une sorte d'enveloppeHttpResponseMessage
. Il contient laExecuteAsync()
méthode pour créer un fichierHttpResponseMessage
. Il simplifie les tests unitaires de votre contrôleur.Les autres types de retour sont des types de classes typées fortes sérialisées par l'API Web à l'aide d'un formateur de média dans le corps de la réponse. L'inconvénient était que vous ne pouvez pas retourner directement un code d'erreur tel qu'un 404. Tout ce que vous pouvez faire est de lancer une
HttpResponseException
erreur.la source
Je préfère implémenter la fonction d'interface TaskExecuteAsync pour IHttpActionResult. Quelque chose comme:
, où _request est le HttpRequest et _respContent est la charge utile.
la source
Nous avons les avantages suivants d'utiliser
IHttpActionResult
plus deHttpResponseMessage
:IHttpActionResult
nous nous concentrons uniquement sur les données à envoyer et non sur le code d'état. Donc, ici, le code sera plus propre et très facile à entretenir.async
etawait
par défaut.la source