web-dev-qa-db-fra.com

comment renvoyer msg erreur msg dans asp.net web api?

Je voudrais renvoyer un message d'erreur json, mais pour le moment, je ne le vois pas dans le panneau Json

string error = "An error just happened";
JsonResult jsonResult = new JsonResult
{
     Data = error,
     JsonRequestBehavior = JsonRequestBehavior.AllowGet
};
response = Request.CreateResponse(HttpStatusCode.BadRequest, jsonResult.Data);

comment faire ça?

25
user603007

Quelques points:

Si vous ne souhaitez que renvoyer une réponse d'erreur contenant un simple message d'erreur, l'API Web fournit une méthode CreateErrorResponse pour cela. Alors vous pouvez simplement faire:

return Request.CreateErrorResponse(HttpStatusCode.BadRequest, 
                                   "An error just happened");

Cela entraînera la réponse HTTP suivante (autres en-têtes omis pour des raisons de brièveté):

HTTP/1.1 400 Bad Request
Content-Type: application/json; charset=utf-8
Content-Length: 36

{"Message":"An error just happened"}

Si vous souhaitez plutôt renvoyer un objet personnalisé, utilisez Request.CreateResponse comme vous le faites, mais n'utilisez pas MVC JsonResult. Au lieu de cela, passez votre objet directement à CreateResponse:

var myError = new
{
    Data = "An error just happened",
    OtherDetails = "foo bar baz"
};

return Request.CreateResponse(HttpStatusCode.BadRequest, myError);

Maintenant, supposons que vous le fassiez, mais que vous ne récupériez pas JSON du serveur. Il est important de comprendre que l'API Web utilise normalement la négociation du type de contenu pour déterminer le format à utiliser lors du renvoi de la réponse. Cela signifie que cela examine l'en-tête Accept qui a été envoyé par le client avec la demande. Si l'en-tête Accept contient par exemple application/xml, alors l'API Web renverra XML. Si l'en-tête contient application/json, il retournera JSON. Donc, vous devriez vérifier que votre client envoie le bon en-tête Accept.

Cela dit, il est possible de forcer Web API à toujours renvoyer les données dans un format spécifique si vous le souhaitez vraiment. Vous pouvez le faire au niveau de la méthode en utilisant une surcharge différente de CreateResponse qui spécifie également le type de contenu:

return Request.CreateResponse(HttpStatusCode.BadRequest, myError, 
    new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"));

Vous pouvez également supprimer le formateur XML de la configuration dans votre fichier WebApiConfig:

config.Formatters.Remove(config.Formatters.XmlFormatter);

Cela forcera l'API Web à toujours utiliser JSON, quelle que soit la demande du client.

58
Brian Rogers

vous pouvez retourner JSON comme ci-dessous, 

 return Request.CreateResponse<ResponseApiModel>(HttpStatusCode.BadRequest, response);

Je recommande d'utiliser IHttpActionResult sur votre type de retour de méthode à la place de HttpResponseMessage, si le type de retour de méthode de votre api est IHttpActionResult. vous pouvez revenir comme;

 return Content(HttpStatusCode.InternalServerError, response);

vous pouvez également vérifier ce lien sur les meilleures pratiques de erreur de retour Surtout la réponse de @Daniel Little est vraiment utile.

Je sais que la réponse a été ajoutée trop tard, mais peut-être aider quelqu'un.

5
arslanaybars

JsonResult est un concept MVC. Cela ne fonctionne pas dans l'API Web. Une façon de renvoyer explicitement le contenu json consiste à utiliser la classe que j'ai créée dans cette réponse https://stackoverflow.com/a/20504951/6819

1
Darrel Miller

Ajoutez config.Formatters.Remove (config.Formatters.XmlFormatter); line dans votre fichier WebApiConfig

0
Amit Nikam