web-dev-qa-db-ja.com

WEB APIからメッセージを取得する方法は?

いくつかのWebAPIを作成しましたが、エラーが発生すると、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;
    }
}

どんな助けでも大歓迎です。

17
Vadim

Acceptまたはコンテンツタイプを適切に設定していることを確認してください(リクエストコンテンツの解析で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);もできるかもしれません

31
Jeff

メッセージを取得する1つの方法は、次のことです。

_((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());
   }

}
_

最終更新(うまくいけば...)

OK、今私はそれを理解しました-代わりにこれをやってみてください:

httpResponseMessage.Content.ReadAsAsync<HttpError>().Result;

6
Joanna Derks

HttpResponseMessage.ReasonPhraseにある必要があります。それが少し奇妙な名前のように聞こえる場合、それはHTTP仕様での名前の付け方だからです http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html ==

1
Darrel Miller

これは、...Async().Result()タイプの呼び出しを回避するエラー応答からメッセージを取得するためのオプションです。

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

response.ContentはタイプObjectContent<HttpError>最初です。

1
Ben Bartle

OK、これは陽気ですが、QuickWatchを使用して、このエレガントなソリューションを思いつきました。

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

それはとても読みやすいです!

0
cerhart