18

我创建了一些 web api,当发生错误时,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;
    }
}

任何帮助是极大的赞赏。

4

5 回答 5

31

确保您正确设置了接受和/或内容类型(解析请求内容时出现 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);

于 2013-01-31T15:41:14.843 回答
7

获取消息的一种方法是:

((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;

于 2013-01-28T14:48:43.937 回答
2

这是一个从错误响应中获取消息的选项,可避免进行某种...Async().Result()类型的调用。

((HttpError)((ObjectContent<HttpError>)response.Content).Value).Message

不过,您应该首先确保它response.Content是类型ObjectContent<HttpError>

于 2014-09-24T19:03:32.310 回答
1

它应该在 HttpResponseMessage.ReasonPhrase 中。如果这听起来有点奇怪的名字,那只是因为它在 HTTP 规范http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html中是这样命名的

于 2013-01-28T15:07:49.570 回答
0

好的,这很有趣,但是使用 QuickWatch 我想出了这个优雅的解决方案:

(新 System.Collections.Generic.Mscorlib_DictionaryDebugView(((System.Web.Http.HttpError)(((System.Net.Http.ObjectContent)(httpResponseMessage.Content)).Value)))).Items[0].Value

这是超级可读的!

于 2014-04-28T07:52:42.667 回答