为什么我在使用线程的并发 HTTP 连接方面受到限制

Bag*_*ani 1 c# multithreading http iis-10

我试图同时打开大约 25 个与主机的连接。
我的操作系统是 windows 10。
为了进行测试,我在本地打开了一个简单的网站,IIS并使用Thread.Sleep(2000).

现在在客户端上使用此代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

我得到了以下结果:

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
Run Code Online (Sandbox Code Playgroud)

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

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

Cod*_*ter 5

WHO?您的操作系统和 Web 服务器制造商,即 Microsoft。

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

见例如:

并且从使用 signalr 时,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 来管理它。看:

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

System.Net.ServicePointManager.DefaultConnectionLimit = 25;
Run Code Online (Sandbox Code Playgroud)