いくつかの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;
}
}
どんな助けでも大歓迎です。
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);
もできるかもしれません
メッセージを取得する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;
HttpResponseMessage.ReasonPhraseにある必要があります。それが少し奇妙な名前のように聞こえる場合、それはHTTP仕様での名前の付け方だからです http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html ==
これは、...Async().Result()
タイプの呼び出しを回避するエラー応答からメッセージを取得するためのオプションです。
((HttpError)((ObjectContent<HttpError>)response.Content).Value).Message
response.Content
はタイプObjectContent<HttpError>
最初です。
OK、これは陽気ですが、QuickWatchを使用して、このエレガントなソリューションを思いつきました。
(new System.Collections.Generic.Mscorlib_DictionaryDebugView(((System.Web.Http.HttpError)(((System.Net.Http.ObjectContent)(httpResponseMessage.Content))。Value))))。Items [0] .Value
それはとても読みやすいです!