.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 库对于某些服务器来说非常慢的主要内容,如果未能解决你的问题,请参考以下文章
《ASP.NET Core 6框架揭秘》实例演示[18]:HttpClient处理管道