.NET Core 2.2 HttpClient/WebClient vs Curl - .NET 库对于某些服务器来说非常慢

Posted

技术标签:

【中文标题】.NET Core 2.2 HttpClient/WebClient vs Curl - .NET 库对于某些服务器来说非常慢【英文标题】:.NET Core 2.2 HttpClient/WebClient vs Curl - .NET libs very slow for some servers 【发布时间】:2019-09-27 02:16:29 【问题描述】:

编辑:添加了复制示例 + 我正在使用 .Net Core 2.2.203 在 Ubuntu 18.04 上运行此(在所有服务器上)。

编辑:在我的 Windows 10 笔记本电脑上在家进行测试;相同的结果

我有一段非常简单的 HttpClient 代码(建议使用静态代码,但我也使用 using() 进行了测试):

sw.Start(); // stopwatch
client.GetAsync(url).Result();
sw.Stop();

然后是卷曲:

time curl -L "url" > /dev/null

对于猞猁:

time lynx "url" > /dev/null

差异是惊人的;它确实取决于请求的服务器/url,但我从 HttpClient 获得的差异比 curl/lynx 慢 2-50 倍 来自同一服务器的请求

我尝试了所有能找到的修复方法;

没有代理的HttpHandler(UseProxy = false,Proxy = null)

使用 await 代替 .Result (这不应该有所作为,它确实没有)

网络客户端

现代HttpClient

和 Curl 包装器 CurlThin

最后一个选项(显然)确实给出了正确的结果,其余的(.NET 选项)非常慢。

现在我正在使用 Curl 包装器,因为 .NET 结果不正确并且会减慢我们的堆栈速度。

以前有人用过吗?我尝试了(如您在上面看到的)谷歌搜索提供的所有“修复”,但没有一个提供任何帮助。

编辑:来自 cmets 中的 Matthiee,如果您使用 Powershell 运行 Windows,这也会重现它;

(Measure-Command -Expression $site = Invoke-WebRequest -Uri "reddit.com" ).Milliseconds

编辑:要重现的代码:

用于:

dotnet run -- https://reddit.com
using System;
using System.Diagnostics;
using System.Net.Http;

namespace Download.Playground

    class Program
    
        static HttpClient client;

        
        static void Main(string[] args)
        
        
            HttpClientHandler hch = new HttpClientHandler();
            hch.Proxy = null;
            hch.UseProxy = false;
            client = new HttpClient(hch);
       
            Stopwatch sw = new Stopwatch();

            sw.Start();
            var result = client.GetAsync(args[0]).Result; 
            sw.Stop();

            Console.WriteLine($"Spent sw.ElapsedMillisecondsms"); 

        
        
    

检查20次的小脚本,运行:

./runbench https://reddit.com
#!/bin/bash

for i in 1..20
do
    dotnet run -- $1
    time curl -L $1 > /dev/null
done

【问题讨论】:

使用同步方法也会发生这种情况吗?请提供一个可以让我们重现差异的网址。 是的,例如 DownloadString() 也会发生这种情况。 Reddit.com 就是一个很好的例子;在 HttpClient 等上,我得到 ~1800 毫秒,而 curl 总是给我 reddit.com 的 HttpClient(是的,我尝试了不同的服务器;相同的结果)在 curl 和 httpclient 的 30 个请求中提供了 5-10 倍的慢结果。 对我来说它也慢了 5 倍。我用它来测量时间` (Measure-Command -Expression $site = Invoke-WebRequest -Uri "reddit.com" ).Milliseconds ` 也许这就是问题所在? github.com/dotnet/corefx/issues/37035 ;我使用的所有 Linux 机器都有 ipv6。让我通过关闭来测试我的笔记本电脑。 => 不,不是这样。 您是否尝试使用同一个 HttpClient 多次连接?也许有些初始化需要很长时间,尽管 1600 毫秒的差异对于任何初始化代码来说似乎都太大了 【参考方案1】:

问题已解决,只是导致大部分目标受众网站没有缓存其内容的多种因素。与 HttpClient 无关(除了它不发送用户代理)。

阅读 cmets 了解更多信息。

【讨论】:

以上是关于.NET Core 2.2 HttpClient/WebClient vs Curl - .NET 库对于某些服务器来说非常慢的主要内容,如果未能解决你的问题,请参考以下文章

.NET CORE HttpClient使用

.Net及.Net Core下HttpClient详解

《ASP.NET Core 6框架揭秘》实例演示[18]:HttpClient处理管道

在.NET Core使用 HttpClient 的正确方式

.net core HttpClient 使用之消息管道解析

.net core HttpClient 使用之消息管道解析