编辑:添加了复制示例+我正在具有.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(不是那应该有所作为,实际上的确没有)
WebClient
ModernHttpClient
和Curl包装器CurlThin
最后一个选项(显然)确实给出了正确的结果,其余选项(.NET选项)却非常慢。
现在我正在使用Curl包装器,因为.NET结果只是不正确的,并且减慢了我们的堆栈速度。
有人有过吗?我尝试了(如您在上面看到的)Googling提供的所有“修复”,但是没有一个提供任何帮助。
编辑:从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
答案 0 :(得分:0)
问题得以解决,仅是多种因素的综合作用,导致大部分目标受众站点无法缓存其内容。与HttpClient无关(此外,它不发送用户代理)。
阅读评论以获取更多信息。