为什么我受限于使用线程的并发 HTTP 连接



我正在尝试同时打开大约 25 个与主机的连接。
我的操作系统是视窗 10。
为了进行测试,我在本地IIS上调出一个简单的网站,并使用Thread.Sleep(2000)以 2 秒的延迟向用户响应一个简单的数据。

现在在客户端上使用以下代码:

const int len = 25;
for (int i = 0; i < len; i++)
{
new Thread(new ParameterizedThreadStart((idx) =>
{
// start downloading data.
var res = new WebClient().DownloadString("http://192.168.1.101:8090/");
// log index and time when done.
Console.WriteLine($"{Convert.ToInt32(idx).ToString("00")} done at:{ DateTime.Now.ToString("HH:mm:ss:ffff") }");
})).Start(i);
}

我得到了以下结果:

Thread 01 done at 40:8476 ms
Thread 00 done at 40:8476 ms
Thread 03 done at 40:8496 ms
Thread 04 done at 40:8496 ms
Thread 02 done at 40:8506 ms
Thread 05 done at 40:8506 ms
Thread 07 done at 40:8516 ms
Thread 06 done at 40:8516 ms
Thread 08 done at 40:8536 ms
Thread 09 done at 40:8545 ms
Thread 11 done at 42:8510 ms
Thread 10 done at 42:8510 ms
Thread 12 done at 42:8560 ms
Thread 14 done at 42:8560 ms
Thread 15 done at 42:8570 ms
Thread 13 done at 42:8580 ms
Thread 16 done at 42:8590 ms
Thread 17 done at 42:8590 ms
Thread 18 done at 42:8610 ms
Thread 19 done at 42:8610 ms
Thread 21 done at 44:8565 ms
Thread 20 done at 44:8565 ms
Thread 23 done at 44:8634 ms
Thread 24 done at 44:8654 ms
Thread 22 done at 44:8654 ms

上面的结果告诉我们:
1-Thread 0 to 9同时获得了数据。第二个 40(
2-Thread 10 to 19在上一步后 2 秒后同时获取数据。第二个 42(
3-Thread 20 to 24同时获取数据。 上一步后 2 秒后。第二44(

现在我的问题是世卫组织限制了我,为什么它只能同时打开 10 个HTTP连接,我怎样才能将其设置为无限制。
如果有任何其他平台或编程语言,我们将受到欢迎。

谁?您的操作系统和 Web 服务器制造商,正在Microsoft。

为什么?因为 Windows 10 是一个客户端操作系统,Microsoft不希望您在此托管任何严肃的 Web 应用程序。

例如,请参阅:

  • 为什么 IIS 一次只允许 3 个连接?
  • Windows 7 IIS v7.5 是否有任何连接限制?
  • Windows 7 中 IIS 上的最大 http 请求数

从 使用 信号器时,IIS 上是否有任何连接限制,链接到 SignalR 文档:

当 SignalR 托管在 IIS 中时,支持以下版本。请注意,如果使用客户端操作系统,例如用于开发(Windows 8 或 Windows 7(,则不应使用完整版本的 IIS 或 Cassini,因为将施加 10 个同时连接的限制,由于连接是暂时的,经常重新建立,并且在不再使用时不会立即处理,因此将很快达到。IIS Express 应该在客户端操作系统上使用

还有其他帖子,例如Windows 10连接限制是否适用于自托管应用程序?,提到了20个连接,但这是20个设备(可能由远程IP地址识别(连接到选定的Windows服务(SMB,IIS,...(。

IIS限制是10,并且已经很多年了,我想从Windows 7开始。

所以这个问题的答案的前半部分是:

  • 如果在 Windows 10 上进行开发时需要 10 个以上的同时传入HTTP 连接,请使用 IIS Express 或 IIS 或 Cassini 以外的任何其他 Web 服务器。

但这个答案还有后半部分。如果您需要超过 10 个(或 2 个或 ...,具体取决于环境(同时传出HTTP 连接,则 ServicePointManager 可以管理此连接。看:

  • 尝试并行运行多个 HTTP 请求,但受到 Windows(注册表(的限制
  • 如何以编程方式删除 WebClient 中的 2 个连接限制
  • Microsoft 文档:.NET 框架中的网络编程 - 管理连接

因此,在执行请求之前更改限制:

System.Net.ServicePointManager.DefaultConnectionLimit = 25;

最新更新