「POSTされたXMLデータを抜き出してそのままデータベースに保存する」という内容のWeb APIをASP.NETを用いて作成しているのですが、その中で気になる事があり、ここで質問させていただきます。
現状のAPIでは、POSTされたデータを文字列で抜き出す処理を以下のコマンドを用いて行っています:
C#
1string xdata = Request.Content.ReadAsStringAsync().Result;
この状態で50KB程度のXMLデータをPOSTすると、上記コマンドでタイムアウトが発生しました。
そこで試しに上記コマンドを
C#
1string xdata = await Request.Content.ReadAsStringAsync();
と書き換え、このコマンドを含むAPI関数の定義をpublic T Post(...)
という形からpublic async Task<T> Post(...)
という形に変更したところ、先程のXMLデータをPOSTしても今度はタイムアウトにならず最後の処理まで完了しました。
C#の非同期処理に関する他の質問を拝見した際に「Task.Resultはデッドロックが発生する」というような回答をお見かけしたのですが、先程のものよりも小さい20KB程度のXMLデータをPOSTしたときは「~.Result」のコマンドでもタイムアウトせず最後まで処理が完了したので、本当にこのデッドロックによるものなのかが分かりません(当初はPOSTできる文字列データの長さに上限があるのかと思っていました)。
今回のケースでも前述のような「Task.Resultを使用したことによるデッドロック」が原因でタイムアウトが発生したと考えるのが妥当でしょうか?
追記:開発環境および非同期処理に関する他の質問
開発環境は以下の通りです。
・Windows 10
・Visual Studio 2017
・.NET Framework 4.6.1
また上記文章における「非同期処理に関する他の質問」とは以下の2つを差しています。
https://teratail.com/questions/292783
https://teratail.com/questions/155003
回答1件
あなたの回答
tips
プレビュー