如何从WEB API检索消息?

时间:2013-01-28 14:22:00

标签: asp.net-web-api consumer

我创建了一些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;
    }
}

非常感谢任何帮助。

5 个答案:

答案 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 ]。价值

这是超级可读的!