2017-07-18 7 views
1

現在、Web APIと統合されたアプリケーションを開発中です。私はPUT要求をWeb APIに送信して製品を更新する非同期機能を持っています。コンソールアプリでHttpReponseMessageにStatusCode 200がありますが、 'Result'が空です。

public async Task<ResponseStatus> updateProduct(Item product) 
    { 
     string URL = client.BaseAddress + "/catalog/products/" + product.id; 
     HttpResponseMessage response = await client.PutAsJsonAsync(URL, product).ConfigureAwait(false); 
     var payload = response.Content.ReadAsStringAsync(); 
     ResponseStatus res = JsonConvert.DeserializeObject<ResponseStatus>(await payload.ConfigureAwait(false)); 

     return res; 
    } 

私はこの機能が意図したとおりに動作し、私は応答のResultでJSON文字列として更新された製品を受け取る自分のアプリケーションをテストするために使用しています。

enter image description here

私はASP.Netアプリケーションからこの関数を呼び出すしようとするとしかし、私はそれが200のステータスコードを持っているにもかかわらず、私はまた私の更新ことを確認することができ、Resultに空の文字列を受け取りますコンソールアプリケーションで呼び出されたときに確実に更新されますが、製品には影響しません。

enter image description here

これはASP.Netアプリケーションとテストコンソールアプリケーションで動作を除いて、いくつかのWeb APIは、私は、このようなほぼ正確に同じように機能し、このGET要求として持っていることを呼び出すがあります。 ASP.Netアプリで私もResultかかわらず、成功のステータスコードを受け取るのはなぜ

public async Task<Product> getProductByID(int id) 
    { 
     Product product = null; 
     string URL = client.BaseAddress + "/catalog/products/" + id; 
     string additionalQuery = "include=images,variants"; 
     HttpResponseMessage response = await client.GetAsync(URL + "?" + additionalQuery).ConfigureAwait(false); 
     if (response.IsSuccessStatusCode) 
     { 
      var payload = response.Content.ReadAsStringAsync(); 
      product = JsonConvert.DeserializeObject<Product>(await payload.ConfigureAwait(false)); 
     } 
     return product; 
    } 

は空であり、製品への更新が実際に行われていませんか?

答えて

1

私はBigCommerce API経由で製品を更新しようとしていましたが、製品のcustom_urlオブジェクトのURLがnullに設定されているコードでエラーが発生しました。

enter image description here

これは明らかにBigCommerceのAPIサーバー上のエラーを生成しましたが、成功コード200は、製品が更新されていませんでしたにもかかわらず、返されていたとして、それは正しく処理取得することができません。これは私が得ていた空の反応を生み出していました。

1

awaitpayload Taskには、ConfigureAwait(false)を付けないでください。

ConfigureAwait(false)を使用すると、TaskResultを返したときにASP.NET応答コンテキストを保持することは保証されません。これはASP.NETランタイムの特質です。

それはBest Practice tip for async/await by Microsoftとして述べています:

あなたはコンテキストを必要とする方法でのawait後のコードを持っているときは、ConfigureAwaitを使用しないでください。 GUIアプリケーションの場合、これにはGUIエレメントを操作する、データバインドされたプロパティを書き込む、またはDispatcher/CoreDispatcherなどのGUI固有のタイプに依存するコードが含まれます。 ASP.NETアプリケーションの場合、HttpContext.Currentを使用するコード、またはコントローラーアクションのreturnステートメントを含むASP.NET応答を構築するすべてのコードが含まれます。

+0

私は 'ResponseStatus res = JsonConvert.DeserializeObject (await payload);に変更しようとしましたが、残念ながらそれは違いはありませんでした。他の行からConfigureAwait(false)を削除するべきですか? –

+0

潜在的に 'awaitクライアントを持つ行。GetAsync' – toadflakz

+0

残念ながら、私の質問によると[client.GetAsync]行が呼び出された後、アプリケーションのデバッグがちょうど停止することを意味しています[ここ](https://stackoverflow.com/questions/44828701/calling-asynchronous -api-in-asp-net-application)を使用して問題点を説明します。 'await payload.C​​onfigureAwaity(false)'の行は私が私の答えで示した 'getProductByID'関数で正しく動作するので、それは問題ではないと思います。 –

関連する問題