Je renvoie un NotFound IHttpActionResult
, lorsque quelque chose n'est pas trouvé dans mon action WebApi GET. Parallèlement à cette réponse, je souhaite envoyer un message personnalisé et / ou le message d'exception (le cas échéant). Le courant ApiController
de NotFound()
méthode ne fournit pas une surcharge pour passer un message.
Y a-t-il une manière de faire ça? ou je devrai écrire ma propre coutume IHttpActionResult
?
c#
asp.net-web-api
http-status-code-404
httpresponse
Ajay Jadhav
la source
la source
Réponses:
Vous devez écrire votre propre résultat d'action si vous souhaitez personnaliser la forme du message de réponse.
Nous voulions fournir les formes de message de réponse les plus courantes prêtes à l'emploi pour des choses comme de simples 404 vides, mais nous voulions également que ces résultats soient aussi simples que possible; l'un des principaux avantages de l'utilisation des résultats d'action est qu'elle rend votre méthode d'action beaucoup plus facile à tester unitaire. Plus nous attribuons de propriétés aux résultats d'action, plus votre test unitaire doit prendre en compte de choses pour s'assurer que la méthode d'action fait ce que vous attendez.
Je souhaite souvent pouvoir également fournir un message personnalisé, alors n'hésitez pas à enregistrer un bogue pour que nous envisagions de prendre en charge ce résultat d'action dans une prochaine version: https://aspnetwebstack.codeplex.com/workitem/list/advanced
Une bonne chose à propos des résultats d'action, cependant, est que vous pouvez toujours écrire les vôtres assez facilement si vous voulez faire quelque chose de légèrement différent. Voici comment vous pouvez le faire dans votre cas (en supposant que vous vouliez le message d'erreur en texte / brut; si vous voulez JSON, vous feriez quelque chose de légèrement différent avec le contenu):
Ensuite, dans votre méthode d'action, vous pouvez simplement faire quelque chose comme ceci:
Si vous avez utilisé une classe de base de contrôleur personnalisée (au lieu d'hériter directement d'ApiController), vous pouvez également éliminer le «ceci». part (qui est malheureusement nécessaire lors de l'appel d'une méthode d'extension):
la source
Voici une ligne pour renvoyer un IHttpActionResult NotFound avec un message simple:
la source
Vous pouvez utiliser
ResponseMessageResult
si vous le souhaitez:oui, si vous avez besoin de versions beaucoup plus courtes, je suppose que vous devez implémenter votre résultat d'action personnalisé.
la source
Vous pouvez utiliser la propriété ReasonPhrase de la classe HttpResponseMessage
la source
Vous pouvez créer un résultat de contenu négocié personnalisé comme le suggère d3m3t3er. Cependant j'hériterais de. De plus, si vous n'en avez besoin que pour renvoyer NotFound, vous n'avez pas besoin d'initialiser le statut http à partir du constructeur.
la source
Je l'ai résolu en dérivant simplement
OkNegotiatedContentResult
et en remplaçant le code HTTP dans le message de réponse résultant. Cette classe vous permet de renvoyer le corps du contenu avec n'importe quel code de réponse HTTP.la source
Si vous héritez de la base
NegotitatedContentResult<T>
, comme mentionné, et que vous n'avez pas besoin de transformer votrecontent
(par exemple, vous voulez simplement renvoyer une chaîne), vous n'avez pas besoin de remplacer laExecuteAsync
méthode.Tout ce que vous avez à faire est de fournir une définition de type appropriée et un constructeur qui indique à la base le code d'état HTTP à renvoyer. Tout le reste fonctionne.
Voici des exemples pour les deux
NotFound
etInternalServerError
:Et puis vous pouvez créer des méthodes d'extension correspondantes pour
ApiController
(ou le faire dans une classe de base si vous en avez une):Et puis, ils fonctionnent comme les méthodes intégrées. Vous pouvez soit appeler l'existant,
NotFound()
soit appeler votre nouvelle coutumeNotFound(myErrorMessage)
.Et bien sûr, vous pouvez vous débarrasser des types de chaînes "codés en dur" dans les définitions de type personnalisées et les laisser génériques si vous le souhaitez, mais vous devrez peut- être vous inquiéter de
ExecuteAsync
ce que vous<T>
réellement.Vous pouvez consulter le code source pour
NegotiatedContentResult<T>
voir tout ce qu'il fait. Il n'y a pas grand-chose à faire.la source
J'avais besoin de créer une
IHttpActionResult
instance dans le corps d'uneIExceptionHandler
classe, afin de définir laExceptionHandlerContext.Result
propriété. Cependant, je voulais aussi définir uneReasonPhrase
.J'ai trouvé que a
ResponseMessageResult
pouvait envelopper unHttpResponseMessage
(ce qui permet de définir facilement ReasonPhrase).Par exemple:
la source
Iknow PO a demandé avec un texte de message, mais une autre option pour simplement renvoyer un 404 consiste à faire en sorte que la méthode retourne un IHttpActionResult et utilise la fonction StatusCode
la source
Les réponses ici manquent un petit problème d'histoire de développeur. La
ApiController
classe expose toujours unNotFound()
méthode que les développeurs peuvent utiliser. Cela ferait en sorte qu'une réponse 404 contienne un corps de résultat incontrôlé.Je présente ici quelques parties de code " meilleure méthode ApiController NotFound " qui fournira une méthode moins sujette aux erreurs qui ne demande pas aux développeurs de connaître "la meilleure façon d'envoyer un 404".
ApiController
calledApiController
NotFound
méthode pour permettre aux développeurs d'utiliser la première API disponible[Obsolete("Use overload instead")]
protected NotFoundResult NotFound(string message)
que vous souhaitez encouragerNegotiatedContentResult
. voir une meilleure classe NotFoundResult ci-jointe .la source