18

いくつかの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;
    }
}

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

4

5 に答える 5

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は、acceptやコンテンツタイプに基づいてコンテンツのフォーマットを適切に処理する必要があります。不思議なことに、あなたもできるかもしれませんthrow new HttpResponseException("Failed to find customer.", HttpStatusCode.NotFound);

于 2013-01-31T15:41:14.843 に答える
7

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

((ObjectContent)httpResponseMessage.Content).Value

これにより、 も含む辞書が得られますMessage

アップデート

公式ページを参照してください:

http://msdn.microsoft.com/en-us/library/jj127065(v=vs.108).aspx

成功した応答とエラー応答を読み取る方法を変える必要があります。1 つは明らかにあなたのケースの StreamContent であり、もう 1 つは 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 に答える
1

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

于 2013-01-28T15:07:49.570 に答える
0

OK、これは陽気ですが、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 に答える