web-dev-qa-db-ja.com

PostAsJsonAsyncから応答を取得する

このコード行があります

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;

しかし、これは迅速な結果を得るための本当に素朴なアプローチです。 PostAsJsonAsyncReadAsAsyncはこのように設計されておらず、async awaitプログラミングをサポートするように設計されているため、コードは次のようになります。

var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();

また、フラグを使用してオブジェクトが保存されているかどうかを確認する代わりに、200 OKを返すことでHTTPコードを使用して、保存が成功したことを確認する必要があります。

49
cuongle

受け入れられた答えは技術的には正しいですが、.Resultの呼び出しで現在のスレッドをブロックします。 .NET 4.5以降を使用している場合、ほとんどすべての状況でそれを避ける必要があります。代わりに、同等の非同期(非ブロッキング)バージョンを使用します。

var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();

上記のコードを含むメソッドはasyncとマークする必要があり、それ自体はawaitedである必要があります。

33
Todd Menier

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;

注:私はここにそれらを書いたので、実際にはテストしませんでしたが、多かれ少なかれそれはあなたが望むものです。

私はそれが役立つことを願っています!

9
Stephen Lautier

ジェネリックバージョンを呼び出すと、boolが返されます。

var response = new HttpClient().PostAsJsonAsync<bool>(posturi, model).Result;

少なくとも ドキュメント に従って。

2
Davin Tryon

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
            }
2
Xaris Fytrakis