teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

追記&訂正

2021/06/17 07:03

投稿

退会済みユーザー
answer CHANGED
@@ -1,3 +1,26 @@
1
+ **【追記・訂正】**
2
+
3
+ **下の回答で「期待通り 5 件の要求が並列処理され、5 件の応答が約 10 秒で返ってきます」と書きましたが、それは要求先が localhost だったからでした。**
4
+
5
+ HTTP 1.1 仕様で同時接続は 2 つまでとなっています。HttpWebRequest を使った場合にもその制約が適用されるようになっているようですが、ユーザーが **ServicePointManager.DefaultConnectionLimit の設定を変えない場合かつ localhost への要求の場合は制約が外れます**(Int32.MaxValue になる)。
6
+
7
+ ソースコードを見ると(URL 下記)そのコメントに "3. If ServicePoint.DefaultConnectionLimit is set, then take that value" "4. If ServicePoint is localhost, then set to infinite (TO Should we change this value?)" と書いてありますが、試してみるとその通りの動きをしました。
8
+
9
+ [https://referencesource.microsoft.com/#System/net/System/Net/ServicePoint.cs](https://referencesource.microsoft.com/#System/net/System/Net/ServicePoint.cs)
10
+ [https://referencesource.microsoft.com/#System/net/System/Net/ServicePointManager.cs](https://referencesource.microsoft.com/#System/net/System/Net/ServicePointManager.cs)
11
+
12
+ ServicePoint クラスの ConnectionLimit プロパティの中の getter の return 文のところで同時接続数を Int32.MaxValue に設定していました。
13
+
14
+ ただし、localhost か否かの判定はどのタイミングでどのようにしているのか、何がどのタイミングで ConnectionLimit プロパティの getter を呼び出して同時接続数を Int32.MaxValue に設定しているのかはソースコードからは読み切れてません。
15
+
16
+ 試しに、hosts ファイルで 127.0.0.1 にそれらしいホスト名を設定して、そのホスト名を url に設定した場合は同時接続数は 2 になりました。(と言うことは IP アドレスではなくて localhost という名前で判定?)
17
+
18
+ しかし、Fiddler を通してみると、Fiddler は IP アドレス 127.0.0.1 のプロキシなのですが、どこかで IP アドレスから localhost と判定されて、同時接続数は制限されないという結果になりました。
19
+
20
+ 依然として ServicePointManager.DefaultConnectionLimit や ServicePoint.ConnectionLimit の値など、いろいろ不可解な動きに見えるのですが、**とにかく localhost はデフォルトでは同時接続数は Int32.MaxValue になるということは間違いなさそうです**。
21
+
22
+ ---
23
+
1
24
  質問者さんのコードをコピペし、スレッド ID と開始/終了時間が分かるようにコードを追加して試してみましたが、期待通り 5 件の要求が並列処理され、5 件の応答が約 10 秒で返ってきます。
2
25
 
3
26
  ![イメージ説明](c39b7f596c9cb78ea4d1fee5cbc99c48.jpeg)

2

追記

2021/06/17 07:03

投稿

退会済みユーザー
answer CHANGED
@@ -75,4 +75,22 @@
75
75
  }
76
76
  }
77
77
  }
78
- ```
78
+ ```
79
+
80
+ **【追記】**
81
+
82
+ 下の 2021/06/16 15:01 の私のコメントで「後で結果の画像を回答欄に貼っておきます」と書いた件です。
83
+
84
+ 試してみましたが、自分のケースでも「ASP.NET でホストされるアプリケーションの場合は10、それ以外の場合は2」のそれ以外の場合に該当し 2 になっていました。でも、そのために秒単位で待たされるということなないです。どのように確認したかというと、
85
+
86
+ 上のコードはそのまま、ServicePointManager.DefaultConnectionLimit の値を調べるため、以下の画像の赤枠の一行を追加。
87
+
88
+ ![イメージ説明](026497f91d7b24294eb84161e3290391.jpeg)
89
+
90
+ 結果は以下のようになります。質問者さんのケースのように秒の単位で待たされるということはないです。
91
+
92
+ ![イメージ説明](f8b0d8f727b04ea82df0a805505dec73.jpeg)
93
+
94
+ tamoto さんの回答のコメントにある tamoto さんが試した結果も問題なかったようですし、ちょっと不可解ですね。
95
+
96
+ 私の回答のコメントでも書きましたが、Fiddler などのキャプチャツールを使って、5 件の要求が一度に出て行っているかも調べてはいかがですか?

1

訂正

2021/06/16 06:11

投稿

退会済みユーザー
answer CHANGED
@@ -15,7 +15,7 @@
15
15
  }
16
16
  ```
17
17
 
18
- クライアント側は質問者さんのコードをコピペして使いました。それに以下のようにコメントで「// 質問者さんのコードに追加」というコードを、スレッド ID と開始/終了時間が分かるようにコードを追加しています。
18
+ クライアント側は質問者さんのコードをコピペして使いました。それに以下のようにコメントで「// 質問者さんのコードに追加」というコードを、スレッド ID と開始/終了時間が分かるように追加しています。
19
19
 
20
20
  ```
21
21
  using System;