Comment faire pour récupérer des messages à partir de l'API WEB?
J'ai créé certaines api web et lorsqu'une erreur se produit, l'api retourne HttpResponseMessage qui est créé avec CreateErrorResponse message. Quelque chose comme ceci:
return Request.CreateErrorResponse(
HttpStatusCode.NotFound, "Failed to find customer.");
Mon problème est que je ne peux pas comprendre comment récupérer le message (dans ce cas "pas réussi à trouver de la clientèle.") en application du consommateur.
Voici un échantillon de la consommation:
private static void GetCustomer()
{
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
string data =
"{\"LastName\": \"Test\", \"FirstName\": \"Test\"";
var content = new StringContent(data, Encoding.UTF8, "application/json");
var httpResponseMessage =
client.PostAsync(
new Uri("http://localhost:55202/api/Customer/Find"),
content).Result;
if (httpResponseMessage.IsSuccessStatusCode)
{
var cust = httpResponseMessage.Content.
ReadAsAsync<IEnumerable<CustomerMobil>>().Result;
}
}
Toute aide est grandement appréciée.
- Pouvez-vous poster le code où vous êtes en train d'essayer de lire le message d'erreur? Dans ce cas, le contenu du message doit vraiment être un ObjectContent avec un HttpError objet, reportez-vous à la page officielle: msdn.microsoft.com/en-us/library/jj127065(v=vs. 108).aspx de toute façon vous avez de varier la façon dont vous êtes en train de lire la réussite de l'intervention et de la réponse d'erreur tel que l'on est, bien évidemment, dans votre cas StreamContent, et les autres devraient être ObjectContent
- c'est le code. Je ne pouvais pas comprendre comment lire le message d'erreur c'est pourquoi j'ai posté la question. Jusqu'à présent, vous avez été le plus utile personne, mais je ne l'ai toujours pas résolu mon problème. Je suis en train d'essayer plus de choses à droite en suivant votre lien. J'ai été dérouté et ne pas travailler sur ce problème. Mais maintenant, je vais essayer de faire une estimation de nouveau.
- pouvez-vous essayer le code dans Update2 ci-dessous et voir si, en cas d'erreur vous obtenez toujours StreamContent ?
- Je suppose que vous voulez voir le type de contenu. Voici la sortie. "le contenu est de type System.Net.Http.StreamContent." J'ai dû ajouter {0} à la sortie de la type.
- OK, une autre question se pose alors, quand vous créez une réponse d'erreur? Dans quelle condition? Est-il juste au cas où des exceptions ? Notez que
IsSuccessfulStatusCode
évalue àtrue
seulement si le code d'état a été dans200-299
. Se pourrait-il que pour un code de statut spécifique, 400, vous attendez un message d'erreur mais en fait il ne va jamais par le biais de la méthode/de filtre qui est de la création d'une? Peut-être ajouter un peu de l'exploitation forestière pour voir si la méthode de createErrorResponse a été appelée à tous - Quand j'ai appeler l'api à l'aide de Fiddler ou de REPOS de la Console, je vois le message. Dans ce cas, j'ai mis HttpStatus à 400 (Demande de retour.CreateErrorResponse(HttpStatusCode.NotFound "impossible de trouver de la clientèle.");) Tout fonctionne comme prévu. J'ai juste aucune idée de comment faire pour récupérer mon message personnalisé lorsqu'une erreur se produit.
- Je viens de réaliser que j'ai été absent de l'instanciation de la HttpClient. Juste mis à jour le code.
- Voir la dernière mise à jour - cette fois, il faut vraiment travailler, j'ai compris pourquoi j'étais confus
Vous devez vous connecter pour publier un commentaire.
Assurez-vous de définir l'accepter et ou un type de contenu de manière appropriée (source possible d'erreurs 500 sur l'analyse de la demande de contenu):
Ensuite, vous pouvez simplement faire:
C'est tout sur le client bien sûr. WebApi doit gérer la mise en forme du contenu de manière appropriée en se basant sur l'accepter et/ou un type de contenu. Curieux, vous pourriez également être en mesure de
throw new HttpResponseException("Failed to find customer.", HttpStatusCode.NotFound);
Un moyen pour obtenir le message est à faire:
Cela vous donnera un dictionnaire qui contient également la
Message
.Mise à JOUR
Reportez-vous à la page officielle:
http://msdn.microsoft.com/en-us/library/jj127065(v=vs. 108).aspx
Vous devez varier la façon dont vous êtes en train de lire la réussite de l'intervention et de la réponse d'erreur tel que l'on est, bien évidemment, dans votre cas StreamContent, et les autres devraient être ObjectContent.
Mise à JOUR 2
Avez-vous essayé de le faire de cette façon ?
Dernière mise à JOUR (j'espère...)
OK, maintenant je comprends la peine d'essayer de faire ceci à la place:
httpResponseMessage.Content.ReadAsAsync<HttpError>().Result;
((StreamContent)httpResponseMessage.Content).ReadAsAsync<string>().Result
(ou quel que soit le type que vous voulez, essayez de l'objet et de voir ce que vous obtenez comme résultat peut-être)Il devrait être dans HttpResponseMessage.ReasonPhrase. Si cela semble un peu étrange d'un nom, c'est juste parce que c'est la façon dont il est nommé dans la spécification HTTP http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
C'est une option pour faire passer le message de la réponse d'erreur qui évite de faire un
...Async().Result()
type d'appel.Vous devriez assurez-vous que
response.Content
est de typeObjectContent<HttpError>
mais d'abord.OK c'est hilarant, mais en utilisant espion express je suis venu avec cette solution élégante:
(nouveau System.Collections.Generic.Mscorlib_DictionaryDebugView(((System.Web.Http.HttpError)(((System.Net.Http.ObjectContent)(httpResponseMessage.Content)).Value)))).Items[0].Value
C'est super lisible!