具有同时请求的 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.
据我所知,在 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.