33

このコード行があります

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

Called WebAPI コントローラーは、オブジェクトが保存されたことを確認するために bool を返しますが、その bool 応答を返すにはどうすればよいですか?

4

6 に答える 6

71

コンテンツから引き続き取得:

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

しかし、これは結果を得るための迅速な方法のための本当に単純なアプローチです。プログラミングをサポートするように設計されているため、コードは次のようにする必要がありPostAsJsonAsyncますReadAsAsyncasync await

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

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

于 2013-03-04T15:50:22.737 に答える
40

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

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

上記のコードを含むメソッドはマークする必要がありasync、それ自体をawait編集する必要があることに注意してください。

于 2014-03-23T18:40:41.947 に答える
12

.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;

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

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

于 2013-05-03T08:58:15.230 に答える
3

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
            }
于 2013-07-16T13:47:07.797 に答える
3

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

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

少なくともドキュメントによると。

于 2013-03-04T15:47:50.820 に答える