我创建了一些web apis,当发生错误时,api返回使用CreateErrorResponse消息创建的HttpResponseMessage。像这样:
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;
}
}
非常感谢任何帮助。
答案 0 :(得分:31)
确保正确设置accept和/或内容类型(解析请求内容时可能出现500个错误的来源):
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");
然后你可以这样做:
var errorMessage = response.Content.ReadAsStringAsync().Result;
当然,这一切都在客户端。 WebApi应根据接受和/或内容类型适当地处理内容的格式。好奇,您也可以throw new HttpResponseException("Failed to find customer.", HttpStatusCode.NotFound);
答案 1 :(得分:6)
获取信息的一种方法是:
((ObjectContent)httpResponseMessage.Content).Value
这将为您提供一个包含Message
。
<强>更新强>
请参阅官方页面:
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;
答案 2 :(得分:1)
它应该在HttpResponseMessage.ReasonPhrase中。如果这听起来像一个奇怪的名字,那只是因为它是在HTTP规范中命名的方式http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html
答案 3 :(得分:1)
这是一个从错误响应中获取消息的选项,可以避免进行...Async().Result()
类型的呼叫。
((HttpError)((ObjectContent<HttpError>)response.Content).Value).Message
您应首先确保response.Content
的类型为ObjectContent<HttpError>
。
答案 4 :(得分:0)
好的,这很有趣,但使用QuickWatch我想出了这个优雅的解决方案:
(new System.Collections.Generic.Mscorlib_DictionaryDebugView((System.Web.Http.HttpError)(((System.Net.Http.ObjectContent)(httpResponseMessage.Content))。Value))))。Items [0 ]。价值
这是超级可读的!