【发布时间】:2018-08-14 15:05:37
【问题描述】:
据我所知,在 HTTP 1.1 中,您可以对多个请求使用相同的 TCP/IP 连接,但在该连接上一次不能执行多个请求。换句话说,它必须像:请求,响应,请求,响应,请求,...。你不能做这样的事情:Req1,Req2,Resp1,Req3,Resp3,Resp2。也许你可以使用 HTTP/2,我不知道。
无论如何,我的问题是:如果您尝试使用 FlurlClient 发送多个同时请求会发生什么?
喜欢:
using (var client = new FlurlClient("https://api.com"))
{
var req1Task = client.Request("path1").PostJsonAsync(thing);
var req2Task = client.Request("path2").GetAsync();
await Task.WhenAll(req1Task, req2Task);
// Do something with responses.
}
我知道 HttpClient 的答案。
答案是,如果您在请求已挂起时尝试在 HttpClient 上启动另一个请求,HttpClient 将创建一个新的 TCP/IP 连接。而如果您一直等到第一个请求完成,HttpClient 会为第二个请求重用连接。
我的猜测是 FlurlClient 是一样的。
【问题讨论】:
-
我不是协议方面的专家,但我知道 HTTP 1.1 支持 pipelining,所以我不确定你关于一次一个请求的假设是否准确。
-
这条评论是关于 HttpClient(不是 FlurlClient)的,无论如何都是一样的。当我运行上面的示例时:var client = new HttpClient(new WebRequestHandler() { AllowPipelining = true })),然后 .NET(或 Windows 中的某个地方)仍然建立多个连接。我不知道这是谁的错 - 客户端或服务器。
-
无论如何,我不太同意在同一个 TCP 连接上多路复用多个同时的 HTTP 请求/响应。这就是多个 TCP 连接的用途。应该在较低级别处理这种复杂性。我们不应该用完 65535 的端口。
标签: tcpclient dotnet-httpclient flurl