HttpClient.GetAsync 一次只执行 2 个请求?

Posted

技术标签:

【中文标题】HttpClient.GetAsync 一次只执行 2 个请求?【英文标题】:HttpClient.GetAsync executes only 2 requests at a time? 【发布时间】:2017-12-30 15:46:08 【问题描述】:

为什么 HttpClient.GetAsync()/PostAsync()/SendAsync() 等一次只能调度 2 个请求?

我通过以下方式对此进行了测试:

我有一个异步 GET 方法,它在响应前等待 10 秒而不阻塞。

public async Task<string> Get()

    var guid = Guid.NewGuid();
    System.Diagnostics.Trace.WriteLine($"guid: DateTime.Now.ToLongTimeString(): start");
    await Task.Delay(10000);
    System.Diagnostics.Trace.WriteLine($"guid: DateTime.Now.ToLongTimeString(): end");
    return "hello";

如果我通过多次刷新从 Chrome 调用端点,我会看到它们都在我点击刷新后立即执行,并且我在 10 秒后收到响应:

39a20541-a2d6-4cd0-99cd-db0987e273e9: 5:32:44 PM: start
8326d829-28a6-48a2-9874-6506b79488af: 5:32:44 PM: start
aecfbb10-266c-46f8-be3b-bfc2fadf0775: 5:32:44 PM: start
78932f53-37a5-4f26-a56f-b3196256e1cf: 5:32:44 PM: start
39a20541-a2d6-4cd0-99cd-db0987e273e9: 5:32:54 PM: end
8326d829-28a6-48a2-9874-6506b79488af: 5:32:54 PM: end
aecfbb10-266c-46f8-be3b-bfc2fadf0775: 5:32:54 PM: end
78932f53-37a5-4f26-a56f-b3196256e1cf: 5:32:54 PM: end

但如果我在控制台应用程序中使用此代码进行调用:

var client = new HttpClient();
for (var ii = 0; ii < 10; ii++)

    client.GetAsync("http://localhost:50621/api/default");

Console.ReadKey();

我看到Console.ReadKey(); 立即到达,但请求是两个接两个执行的 - 它发出 2 个请求,然后等待 10 秒完成,然后再等待 2 个,再等 10 秒,等等,即使所有 10 个请求都有据说已经安排好了。

80546610-c20e-4ff1-b6e5-0fe1688e8803: 5:39:10 PM: start
9bbbb707-9ea7-44da-9d5b-03efc3c4aa47: 5:39:10 PM: start
80546610-c20e-4ff1-b6e5-0fe1688e8803: 5:39:20 PM: end
9bbbb707-9ea7-44da-9d5b-03efc3c4aa47: 5:39:20 PM: end
a146c3ca-a0d2-4588-b60b-156f1febc944: 5:39:20 PM: start
b71bc77f-9bdb-4aa6-936e-c702eb7d49eb: 5:39:20 PM: start
....

那么为什么不是所有的请求都立即发出呢? HttpClient 对挂起的请求是否有某种限制?

【问题讨论】:

【参考方案1】:

HttpClient,以及其他与http相关的类,使用服务点进行http连接管理:

ServicePoint 类处理与 Internet 资源的连接 基于资源的 Uniform 中传递的主机信息 资源标识符 (URI)。与资源的初始连接 确定 ServicePoint 对象维护的信息, 然后由对该资源的所有后续请求共享。

ServicePointManager.DefaultConnectionLimit静态属性,控制ServicePoint对象默认允许的最大并发连接数,默认该属性值为2。

这意味着默认情况下,您只能有 2 个并发连接到给定主机。要“解决”这个问题 - 将该数字增加到更大的值,通常在应用程序启动时的某个地方。

【讨论】:

以上是关于HttpClient.GetAsync 一次只执行 2 个请求?的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient GetAsync 随机失败

连接到 *** 时 HttpClient.GetAsync 超时

HttpClient.GetAsync,无效的 URI 异常

使用 HttpClient.GetAsync() 时如何确定 404 响应状态

如何阻止 HttpClient.GetAsync(uri) 挂起? [复制]

在 Azure Function 上获取数据时,HttpClient.GetAsync() 会产生 AggregateException