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

Cha*_*esS 5 c# curl webclient httpclient

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

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

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

sw.Start(); // stopwatch
client.GetAsync(url).Result();
sw.Stop();
Run Code Online (Sandbox Code Playgroud)

然后卷曲:

time curl -L "url" > /dev/null
Run Code Online (Sandbox Code Playgroud)

对于山猫:

time lynx "url" > /dev/null
Run Code Online (Sandbox Code Playgroud)

区别是惊人的。它确实取决于所请求的服务器/ URL,但与来自同一服务器的请求的curl / lynx相比,我从HttpClient获得的速度要慢2-50倍。

我尝试了所有可以找到的修复程序;

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

使用await而不是.Result(不是那应该有所作为,但实际上没有影响)

网络客户端

ModernHttpClient

和Curl包装器CurlThin

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

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

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

编辑:从Matthiee的注释,如果您正在运行Windows与Powershell,这也重现它;

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

编辑:复制代码:

用于:

dotnet run -- https://reddit.com
Run Code Online (Sandbox Code Playgroud)
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.ElapsedMilliseconds}ms"); 

        }

    }
}
Run Code Online (Sandbox Code Playgroud)

小脚本检查20次,运行:

./runbench https://reddit.com
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash

for i in {1..20}
do
    dotnet run -- $1
    time curl -L $1 > /dev/null
done
Run Code Online (Sandbox Code Playgroud)

Cha*_*esS 0

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

阅读评论以获取更多信息。