具有同时请求的 FlurlClient 的行为是什么?

What is the behavior of FlurlClient with simultaneous requests?

据我所知,在 HTTP 1.1 中,您可以对多个请求使用相同的 TCP/IP 连接,但您不能在该连接上一次执行多个请求。换句话说,它必须像这样:Request、Response、Request、Response、Request...。你不能做这样的事情: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 是一样的。

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

像您在示例中所做的那样同时进行多个调用是有效且(通常)明智的。一旦达到连接限制(即 adjustable via ServicePointManager), requests will simply queue up until a connection is available. Just be sure that number doesn't get too high or you'll likely start receiving errors from the server. Also, like HttpClient, be sure you're reusing a FlurlClient instance as much as possible so you don't run into this problem.