Как получить сообщение из WEB API?
Я создал несколько веб-apis, и когда возникает ошибка, api возвращает HttpResponseMessage, созданный с сообщением CreateErrorResponse. Что-то вроде этого:
return Request.CreateErrorResponse(
HttpStatusCode.NotFound, "Failed to find customer.");
Моя проблема в том, что я не могу понять, как получить сообщение (в данном случае "Не удалось найти клиента" ) в потребительском приложении.
Здесь образец потребителя:
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;
}
}
Любая помощь очень ценится.
Ответы
Ответ 1
Убедитесь, что вы правильно настроили тип принятия и контента (возможный источник 500 ошибок при разборе содержимого запроса):
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
Тогда вы можете просто сделать:
var errorMessage = response.Content.ReadAsStringAsync().Result;
Что все на клиенте, конечно. WebApi должен правильно обрабатывать форматирование содержимого на основе типа accept и/или контента. Любопытно, что вы также можете throw new HttpResponseException("Failed to find customer.", HttpStatusCode.NotFound);
Ответ 2
Один из способов получить сообщение:
((ObjectContent)httpResponseMessage.Content).Value
Это даст вам словарь, содержащий также Message
.
UPDATE
Обратитесь к официальной странице:
http://msdn.microsoft.com/en-us/library/jj127065(v=vs.108).aspx
Вам нужно изменить способ, которым вы читаете успешный ответ и ответ об ошибке, поскольку, очевидно, в вашем случае StreamContent, а другой должен быть ObjectContent.
ОБНОВЛЕНИЕ 2
Вы пробовали делать это так?
if (httpResponseMessage.IsSuccessStatusCode)
{
var cust = httpResponseMessage.Content.
ReadAsAsync<IEnumerable<CustomerMobil>>().Result;
}
else
{
var content = httpResponseMessage.Content as ObjectContent;
if (content != null)
{
// do something with the content
var error = content.Value;
}
else
{
Console.WriteLine("content was of type ", (httpResponseMessage.Content).GetType());
}
}
ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ (надеюсь,...)
ОК, теперь я это понимаю - просто попробуйте сделать это вместо:
httpResponseMessage.Content.ReadAsAsync<HttpError>().Result;
Ответ 3
Он должен быть в HttpResponseMessage.ReasonPhrase. Если это звучит как странное имя, просто потому, что так оно именовано в спецификации HTTP http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
Ответ 4
Это возможность получить сообщение от ответа об ошибке, которое позволяет избежать типа вызова ...Async().Result()
.
((HttpError)((ObjectContent<HttpError>)response.Content).Value).Message
Сначала убедитесь, что response.Content
имеет тип ObjectContent<HttpError>
.
Ответ 5
Хорошо, это весело, но с помощью QuickWatch я придумал это элегантное решение:
(новый System.Collections.Generic.Mscorlib_DictionaryDebugView (((System.Web.Http.HttpError) (((System.Net.Http.ObjectContent) (httpResponseMessage.Content)). Значение)))). Items [0 ].Value
Это супер читаемо!