为什么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是否对待处理的请求有某种限制?
答案 0 :(得分:7)
HttpClient
以及其他与http相关的类使用服务点进行http连接管理:
ServicePoint类处理与Internet资源的连接 基于资源统一中传递的主机信息 资源标识符(URI)。与资源的初始连接 确定ServicePoint对象维护的信息, 然后由该资源的所有后续请求共享。
有ServicePointManager.DefaultConnectionLimit
静态属性,它控制ServicePoint
对象允许的默认最大并发连接数,默认情况下,此属性的值为2.
这意味着默认情况下,您只能与给定主机建立2个并发连接。要“修复”这个 - 将该数字增加到更大的值,通常是在应用程序启动时的某个地方。