簡體   English   中英

HttpClient.GetAsync一次只執行2個請求?

[英]HttpClient.GetAsync executes only 2 requests at a time?

為什么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是否對待處理的請求有某種限制?

HttpClient以及其他與http相關的類使用服務點進行http連接管理:

ServicePoint類根據資源的統一資源標識符(URI)中傳遞的主機信息處理與Internet資源的連接。 與資源的初始連接確定ServicePoint對象維護的信息,然后由該資源的所有后續請求共享該信息。

ServicePointManager.DefaultConnectionLimit是一個靜態屬性,它控制ServicePoint對象允許的默認最大並發連接數,默認情況下,此屬性的值為2。

這意味着默認情況下,您只能與給定主機建立2個並發連接。 要“修復”這個 - 將該數字增加到更大的值,通常是在應用程序啟動時的某個地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM