Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对于某些服务器,.NET Core 2.2 HttpClient/WebClient与Curl-.NET libs相比速度非常慢_C#_Curl_Httpclient_Webclient - Fatal编程技术网

C# 对于某些服务器,.NET Core 2.2 HttpClient/WebClient与Curl-.NET libs相比速度非常慢

C# 对于某些服务器,.NET Core 2.2 HttpClient/WebClient与Curl-.NET libs相比速度非常慢,c#,curl,httpclient,webclient,C#,Curl,Httpclient,Webclient,编辑:添加了复制示例+我正在使用.NETCore2.2.203在Ubuntu18.04上运行这个(在所有服务器上) 编辑:从我的Windows 10笔记本电脑在家测试;同样的结果 我有一段非常简单的HttpClient代码(建议使用静态代码,但我也使用()进行了测试): 然后是卷曲: time curl -L "url" > /dev/null 对于猞猁: time lynx "url" > /dev/null 差别是惊人的;这实际上取决于

编辑:添加了复制示例+我正在使用.NETCore2.2.203在Ubuntu18.04上运行这个(在所有服务器上)

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

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

然后是卷曲:

time curl -L "url" > /dev/null
对于猞猁:

time lynx "url" > /dev/null
差别是惊人的;这实际上取决于请求的服务器/url,但我发现HttpClient与curl/lynx对来自同一服务器的请求的速度相差2-50倍

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

不带代理的HttpHandler(UseProxy=false,proxy=null)

使用await而不是.Result(这并不是说这会产生影响,事实上也不会)

网络客户

ModernHttpClient

卷发卷得很薄

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

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

以前有人吃过这个吗?我尝试了谷歌提供的所有“修复”,但都没有提供任何帮助

编辑:来自评论中的Matthiee,如果您使用Powershell运行Windows,这也会复制它

(Measure命令-Expression{$site=Invoke WebRequest-Uri“reddit.com”)。毫秒

编辑:要复制的代码:

用于:

dotnet run -- https://reddit.com
要检查20次的小脚本,运行时使用:

./runbench https://reddit.com

问题得到了解决,这是导致大部分目标受众网站没有缓存内容的综合因素。与HttpClient无关(除此之外,它不发送用户代理)


阅读评论了解更多信息

使用同步方法是否也会发生这种情况?请提供一个允许我们重现差异的url。是的,例如DownloadString()也会出现这种情况。Reddit.com就是一个很好的例子;在HttpClient等设备上,我得到约1800ms,而curl始终给我<200ms。同样,从同一台(千兆位管道)服务器测量。无论精确的定时值如何;该服务器的HttpClient(是的,我尝试了不同的服务器;结果相同)在curl和HttpClient的30个请求中提供了5-10倍的速度。对我来说,速度也慢了5倍。。我用它来测量时间`(measure命令-表达式{$site=Invoke WebRequest-Uri”“});我使用的所有Linux机器都有ipv6。让我通过关机来测试我的笔记本电脑。=>不,不是这样。您是否尝试使用同一个HttpClient连接多次?也许有一些初始化需要很长时间,尽管1600毫秒的差异对于任何初始化代码来说似乎都太大了
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"); 

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

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