Quelle est la différence entre HttpResponseMessage et HttpResponseException
J'ai essayé de comprendre et d'écrire un exemple de code:
public HttpResponseMessage Get()
{
var response = ControllerContext.Request
.CreateResponse(HttpStatusCode.BadRequest, "abc");
throw new HttpResponseException(response);
}
Et:
public HttpResponseMessage Get()
{
return ControllerContext.Request
.CreateResponse(HttpStatusCode.BadRequest, "abc");
}
De Violon, vraiment, je ne vois pas de différences entre eux, alors quel est le but de l'utilisation HttpResponseException
?
- double possible de Jeter HttpResponseException ou de la Demande de retour.CreateErrorResponse?
Vous devez vous connecter pour publier un commentaire.
La principale différence entre les deux est-ce. L'exception est utile pour arrêter immédiatement le traitement et la sortie. Par exemple, supposons que j'ai le code suivant
Si l'exécution de ce code et je passe un id qui n'est pas présent, il sera immédiatement arrêter le traitement et retourner un code d'état 404.
Si, au contraire, je retourne HttpResponseMessage, la demande sera heureux de continuer le reste de son traitement et de retourner une erreur 404. La principale différence étant la fin ou non à la demande.
Que Darrel dit que l'exception est utile dans les cas où, dans certains cas, j'ai envie de continuer le traitement (comme lorsque le client est trouvé) et dans d'autres, je n'en ai pas.
L'endroit où vous pouvez utiliser quelque chose comme HttpResponseMessage est dans un Http POST pour retourner un code d'état de 201 et définir l'emplacement de l'en-tête. Dans ce cas, je ne veux de continuer le traitement. Qu'allait faire avec ce code.*
*remarque: Si vous utilisez la version bêta bits, vous devez créer un nouveau HttpResponseMessage. Je suis l'aide de la plus tard bits mais qui nécessitent l'utilisation du CreateResponse méthode d'extension hors de la Demande.
Ci-dessus, je suis entrain de créer une réponse qui définit le code d'état de 201, passe dans le client, puis définit l'emplacement de l'en-tête.
La réponse est ensuite retourné et la demande continue le traitement.
Espère que cette aide
return
?HttpResponseException est utile lorsque le Contrôleur de l'Action de la signature ressemble
Dans ce cas, vous ne pouvez pas facilement renvoyer le code d'état comme 400.
Être conscient que
HttpResponseMessage<T>
s'en va dans la prochaine version de l'API Web.Professional ASP.Net MVC 4
, wrox.com/WileyCDA/WroxTitle/.... Lors de votre API est basée sur le retour de domaine de typeFoo
, vous ne pouvez pas retourner unHttpResponseMessage
dans le cas d'une erreur, mais vous pouvez retourner/jeterHttpResponseException
et donc de fournir les codes d'état etc pour le consommateur. Pourquoi voudriez-vous revenir types de domaine? Bien au contraire de certaines autres réponses ici, ils disent qu'il simplifie UT traiter avec des objets du domaine plutôt qu'un faible niveau cadre des objets comme desHttpResponseMessage
.However, returning a response object is a fairly low-level operation, so Web API controllers almost always return a raw object value (or sequence of values) instead.
...This ability to return a raw object is very powerful, but we’ve lost something with the shift away from ActionResult; namely, the ability to return different values for success and failure.
Personnellement, je préfère choisir au cas par cas, mais il est tellement construit en soutien pourHttpResponseMessage
, il semble y avoir peu de raisons de ne pas l'utiliser.En supposant que vous souhaitez unité de tester les réponses, n'est-il pas logique de toujours renvoyer un HttpResponseMessage? Je n'aime pas particulièrement l'idée d'un retour d'une droite de type à partir d'un ApiController car il ne suit pas typique des modèles de développement.
Dans un non-Web de la classe de l'API va chercher un Client, vous seriez probablement retourner null, avec votre appel, le code de vérification pour une valeur nulle réponse:
Mais dans l'API Web, vous n'allez pas retourner null, vous devez retourner quelque chose, même si ce quelque chose est créé une fois que vous jetez un HttpResponseException. Dans ce cas, pour faciliter les tests, pourquoi ne pas simplement toujours renvoyer un HttpResponseMessage, et assurez-vous que votre signature?
HttpResponseException
dérive deException
et intègreHttpResponseMessage
.Depuis qu'il tire de
Exception
il peut être utile danstry
-catch
scénarios.Par défaut le code d'état renvoyé par
HttpResponseException
estHttpStatusCode.InternalServerError
.L'original de questions que les états, il n'existe pas de réelle différence dans la Réponse renvoyée.
Le but réel de HttpResponseException est de permettre à sous méthodes pour créer et lancer leur propre HttpResponseMessages que le flux de retour vers le haut de la pile d'appel et sont retournés au client.
Pardonner les erreurs, le code écrit à la volée. L'jetés HttpResponseException bulles à travers les actions de la pile d'appel, ne pas se faire attraper par les normal de, les gestionnaires d'Exception et retourne son HttpResponseMessage comme la méthode de l'action elle-même aurait.