据我所知,在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是相同的。
答案 0 :(得分:2)
您的假设关于FlurlClient
是正确的,在这方面与HttpClient
相同。 Flurl只是HttpClient
之上的一薄层抽象层,它本身又是另外几层之上的抽象层。最终,您遇到了实际实现协议的特定于平台的网络堆栈。
像在示例中所做的那样,同时进行多个调用是有效且(通常)明智的做法。一旦达到连接限制(通过ServicePointManager
达到adjustable),请求将简单地排队直到连接可用。只要确保该数字不会太高,否则您可能会开始从服务器接收错误。另外,像HttpClient
一样,请确保您尽可能地重用FlurlClient
实例,以免遇到this problem的麻烦。