このコード行があります
var response = new HttpClient().PostAsJsonAsync(posturi, model).Result;
呼び出されたWebAPIコントローラーは、オブジェクトが保存されたことを確認するためにブール値を返しますが、そのブール値応答を返すにはどうすればよいですか?
コンテンツから取得し続ける:
var httpClient = new HttpClient();
var response = httpClient.PostAsJsonAsync(posturi, model).Result;
bool returnValue = response.Content.ReadAsAsync<bool>().Result;
しかし、これは迅速な結果を得るための本当に素朴なアプローチです。 PostAsJsonAsync
とReadAsAsync
はこのように設計されておらず、async await
プログラミングをサポートするように設計されているため、コードは次のようになります。
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
また、フラグを使用してオブジェクトが保存されているかどうかを確認する代わりに、200 OK
を返すことでHTTPコードを使用して、保存が成功したことを確認する必要があります。
受け入れられた答えは技術的には正しいですが、.Result
の呼び出しで現在のスレッドをブロックします。 .NET 4.5以降を使用している場合、ほとんどすべての状況でそれを避ける必要があります。代わりに、同等の非同期(非ブロッキング)バージョンを使用します。
var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
上記のコードを含むメソッドはasync
とマークする必要があり、それ自体はawait
edである必要があります。
Async操作はすぐに実行されないため、.Resultが間違っているため
代わりに、これを行うことで非同期に行う必要があります:
var httpClient = new HttpClient()
var task = httpClient.PostAsJsonAsync(posturi, model)
.ContinueWith( x => x.Result.Content.ReadAsAsync<bool>().Result);
// 1. GETTING RESPONSE - NOT ASYNC WAY
task.Wait(); //THIS WILL HOLD THE THREAD AND IT WON'T BE ASYNC ANYMORE!
bool response = task.Result
// 2. GETTING RESPONSE - TASK ASYNC WAY (usually used in < .NET 4.5
task.ContinueWith( x => {
bool response = x.Result
});
// 3. GETTING RESPONSE - TASK ASYNC WAY (usually used in >= .NET 4.5
bool response = await task;
注:私はここにそれらを書いたので、実際にはテストしませんでしたが、多かれ少なかれそれはあなたが望むものです。
私はそれが役立つことを願っています!
ジェネリックバージョンを呼び出すと、boolが返されます。
var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result;
少なくとも ドキュメント に従って。
HttpStatusCodeを使用して結果を確認しました。
public HttpStatusCode PostStaffPositions(Foo foo)
{
string uri = myapiuri;
using (HttpClient httpClient = new HttpClient())
{
var response = httpClient.PostAsJsonAsync(uri, foo).Result;
return response.StatusCode;
}
}
そして、コントローラーで次のようにチェックします:
HttpStatusCode update = staffrest.PostStaffPositions(foo);
if (update == HttpStatusCode.OK)
{
//Update Succeed
}
else
{
//Update Failed
}