摘要
Http / 2协议提供了通过单个连接复用多个请求的能力 . 这样可以更有效地使用连接 - 请参阅https://http2.github.io/faq/#why-is-http2-multiplexed
我希望能够使用.Net Core HttpClient来实现这一目标 . 然而,我的测试(基于以下内容)表明对TCP连接的请求比率为1:1 .
在.Net Core HttpClient下是否支持多路复用?如果是这样,它是如何实现的?
到目前为止工作
我有一个示例应用程序(repo可以找到here,具有以下代码;
using (var httpClient = new HttpClient())
{
var request1 = new HttpRequestMessage(HttpMethod.Get, "https://www.google.com");
request1.Version = new Version(2, 0);
var request2 = new HttpRequestMessage(HttpMethod.Get, "https://www.google.com");
request2.Version = new Version(2, 0);
var task1 = httpClient.SendAsync(request1);
var task2 = httpClient.SendAsync(request2);
Task.WaitAll(task1, task2);
var response1 = task1.Result;
var response2 = task2.Result;
Console.WriteLine($"Response 1 - Http Version: {response1.Version}, Http Status Code: {response1.StatusCode}");
Console.WriteLine($"Response 2 - Http Version: {response2.Version}, Http Status Code: {response2.StatusCode}");
}
此代码产生以下结果(所以我知道正在使用Http / 2);
Response 1 - Http Version: 2.0, Http Status Code: OK
Response 2 - Http Version: 2.0, Http Status Code: OK
我从Wireshark可以看到已经创建了2个连接 - 每个连接都需要通过TLS设置;
如果HttpClient多路复用请求,我希望看到一个连接(1个端口,1个握手等) .
1 回答
我想我有答案(虽然肯定会重视反馈);
上面代码的问题是HttpClient正在接收request2,因为它有机会为request1创建TCP连接 . 因此,就HttpClient而言,没有与Multiplex的现有连接 .
但是,如果我创建了一个初始请求(下面的request0)并允许HttpClient打开连接,则后续请求(1和2)使用该现有连接 .
代码:
和Wireshark证明(只有1个端口,1次握手):
我将继续进行进一步的研究,但这似乎是一个胜利者 . 如上所述,任何反馈都非常赞赏 .