2

据我所知,在 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 是一样的。

4

1 回答 1

3

您对在这方面FlurlClient的行为相同的假设是正确的。HttpClientFlurl 只是在 之上的一个薄抽象层HttpClient,它本身就是在更多层之上的抽象。最终,您会遇到实际实现协议的特定于平台的网络堆栈。

像您在示例中所做的那样,同时发生多个呼叫是有效且(通常)明智的。一旦达到连接限制(通过调整ServicePointManager),请求将简单地排队,直到连接可用。请确保该数字不会太高,否则您可能会开始从服务器接收错误。此外,HttpClient请确保您FlurlClient尽可能多地重用实例,以免遇到此问题

于 2018-08-15T01:05:02.073 回答