并发请求的FlurlClient的行为是什么?

时间:2018-08-14 15:05:37

标签: tcpclient dotnet-httpclient flurl

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

1 个答案:

答案 0 :(得分:2)

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

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