質問: 私は`HttpWebRequest`経由でリモートサービスからデータを`HttpWebRequest`ます。受信したJSONメッセージは`List(Of Customer)`として一時的に保存され、その後Dapperを使用してAzure SQLのテーブルに挿入されます。アプリケーションはAzure App Serviceでホストされている.Net Framework 4.6.2を使用してASP.NETとして動作します。したがって、これらは2つのステップです。 A. HTTPリクエストを介してデータを取得し、 `List(Of Customer)` B. Dapperを使用してAzure SQLのCustomerテーブルに`List(Of Customer)`を挿入します。 これは、同じ手順で別のデータセットを読み込んで挿入しようとするまでうまくいきます: C. HTTPリクエストを介してデータを取得し、 `List(Of Payment)` D. Dapperを使用して、Azure SQLの支払いテーブルに`List(Of Payment)`挿入します。 問題:2番目のHTTPリクエスト(ステップC)は常にタイムアウトします。私は複数のテストを行った。ここに私の観察があります: 1. 両方のHTTP要求は、独立して実行すると通常2〜3秒で完了します。 2. ステップの順序をA、C、B、Dに変更すると完全に動作します。後続の複数のリクエストA、C、A、C、...も同様に機能します。これは、リモートサーバーの問題がないことを証明します。 3. HTTP要求のタイムアウトは、SQL挿入が前にある場合にのみ発生します。 4. 私はA + Bを1つの関数に、C + Dを別の関数に分け、GUIを介して2つの別々のボタンでトリガーしました。タイムアウトが発生します。 5. A + Bの後にC + Dが実行されるが、1-2分の遅延があるときはすべて正常です。ステップA + Bにデータが少なく挿入されているようであれば、C + Dの遅延は適切に実行する必要があります。 6. A + Bを実行した後、要求されたURLが存在しない場合でも、同じサーバー(A)に対する他のHTTP要求は常にタイムアウトします。他のHTTPリクエストが同じブラウザウィンドウ、他のPC、または他のPC(別のasp.netセッション)からトリガされたかどうかは関係ありません。 7. 前のポイントで言及された他のHTTPリクエストがキャンセルされると(タイムアウトしたブラウザウィンドウは閉じられ、他のページにリダイレクトされます)、タイムアウトを待つことなく1〜2分遅れることなくC + Dがうまく動作します。数秒後にもトリガーされました。最初のリクエストだけがタイムアウトします。 8. `ServicePoint.ConnectionLimit`と`System.Net.ServicePointManager.DefaultConnectionLimit`を増やそうとしましたが、すでに`Int32.MaxValue`設定されています。 これは、SQLインサートと後続のHTTP要求との間のリンクを示しています。しかし、これは信じがたいようです。メモリリークなどの一般的な問題を指摘します。 編集: それをさらに調査しようとしています。オリジナルのシナリオA + B + C + Dを使用すると、最初のHTTP要求によって返された行の数が制限された後、動作が開始されました。もともとリモートサービスは18.000行を返しました。 10.000のように思えますが、動作するようになってから数えられます(いくつかの実行はまだエラーで実行されています)。ステップAで9.000行が問題なく実行されます。当然ながら、ステップBのSQLインサートは、より少ない時間で済む。
回答: 手順AとCでWebサービス要求の`HttpWebRequest.KeepAlive = False`を設定すると、問題が解決しました。 しかし、それがなぜ役立つのか、根本的な問題の理由は何かをまだ分かりません。