【问题标题】:What is the behavior of FlurlClient with simultaneous requests?FlurlClient 同时请求的行为是什么?
【发布时间】:2018-08-14 15:05:37
【问题描述】:

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

【问题讨论】:

  • 我不是协议方面的专家,但我知道 HTTP 1.1 支持 pipelining,所以我不确定你关于一次一个请求的假设是否准确。
  • 这条评论是关于 HttpClient(不是 FlurlClient)的,无论如何都是一样的。当我运行上面的示例时:var client = new HttpClient(new WebRequestHandler() { AllowPipelining = true })),然后 .NET(或 Windows 中的某个地方)仍然建立多个连接。我不知道这是谁的错 - 客户端或服务器。
  • 无论如何,我不太同意在同一个 TCP 连接上多路复用多个同时的 HTTP 请求/响应。这就是多个 TCP 连接的用途。应该在较低级别处理这种复杂性。我们不应该用完 65535 的端口。

标签: tcpclient dotnet-httpclient flurl


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多