.NET Core 2.2 HttpClient/WebClient vs Curl - .NET libs 对于某些服



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

编辑:从我的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 而不是 。结果(不是说这应该有所作为,它确实没有)

网络客户端

ModernHttpClient

和卷曲包装器 CurlThin

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

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

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

编辑:来自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.ElapsedMilliseconds}ms"); 
}

}
}

小脚本检查 20 次,运行:

./runbench https://reddit.com
#!/bin/bash
for i in {1..20}
do
dotnet run -- $1
time curl -L $1 > /dev/null
done

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

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

最新更新