Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# System.Net.WebClient速度不合理地慢_C#_.net_Performance_Http - Fatal编程技术网

C# System.Net.WebClient速度不合理地慢

C# System.Net.WebClient速度不合理地慢,c#,.net,performance,http,C#,.net,Performance,Http,当使用该方法时,我得到的响应时间非常慢 当使用.NET中的WebClient类获取url时,我需要大约10秒钟才能得到响应,而我的浏览器在不到1秒钟的时间内获取相同的页面。 这是0.5kB或更小的数据 请求涉及POST/GET参数和用户代理头(如果可能会导致问题的话) 我还没有尝试过在.NET中下载数据的其他方法是否会给我带来同样的问题,但我怀疑我可能会得到类似的结果。(我一直觉得.NET中的web请求异常缓慢…) 这可能是什么原因 编辑: 我试着使用System.Net.HttpWebRequ

当使用该方法时,我得到的响应时间非常慢

当使用.NET中的WebClient类获取url时,我需要大约10秒钟才能得到响应,而我的浏览器在不到1秒钟的时间内获取相同的页面。 这是0.5kB或更小的数据

请求涉及POST/GET参数和用户代理头(如果可能会导致问题的话)

我还没有尝试过在.NET中下载数据的其他方法是否会给我带来同样的问题,但我怀疑我可能会得到类似的结果。(我一直觉得.NET中的web请求异常缓慢…)

这可能是什么原因

编辑:
我试着使用
System.Net.HttpWebRequest
来做同样的事情,而是使用以下方法,所有请求都在1秒之内完成

public static string DownloadText(string url)
        var request = (HttpWebRequest)WebRequest.Create(url);
        var response = (HttpWebResponse)request.GetResponse();

        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            return reader.ReadToEnd();
        }
}

使用
System.Net.WebClient
的这种(旧)方法需要15-30秒才能完成每个请求:

public static string DownloadText(string url)
{
       var client = new WebClient();
       byte[] data = client.DownloadData(url);
       return client.Encoding.GetString(data);
}
在这里下载Wireshark

捕获网络数据包并过滤“http”数据包。
它应该会马上给你答案。

对于.NET web请求,没有什么天生的慢;那代码应该没问题。我经常使用
WebClient
,它工作得非常快

每个方向的有效载荷有多大?也许是个愚蠢的问题,但这仅仅是带宽限制吗

在我看来,最有可能的情况是,你的网站已经减速,当你点击URL时,网站的响应速度很慢。这不是客户的错。由于某些原因,DNS也可能是慢的(在这种情况下,您可以将IP硬编码到您的主机文件中),或者中间的一些代理服务器是慢的。 如果该网站不是你的,也有可能是他们检测到了非典型的使用情况,并故意添加延迟来骚扰刮取者


我会抓起Fiddler(一个免费、简单的web检查器)看一下时间安排。

Wireshark的另一个选择(也是免费的)是。

您使用什么浏览器来测试


尝试使用默认IE安装。System.Net.WebClient使用本地IE设置、代理等。可能已经损坏了?

我在WebRequest中遇到了这个问题。尝试设置Proxy=null

    WebClient wc = new WebClient();
    wc.Proxy = null;
默认情况下,WebClient会尝试通过IE设置确定要使用的代理,有时会导致实际请求发送前5秒的延迟

这适用于所有使用WebRequest的类,包括具有HTTP绑定的WCF服务。 通常,您可以在应用程序启动时使用此静态代码:

WebRequest.DefaultWebProxy = null;

当在IE设置(连接选项卡-LAN设置)中选中自动代理设置时,某些工作站上的WebClient可能速度较慢。

WebClient下载速度极慢的另一个原因是您要下载的目标媒体。如果它是一个像USB钥匙一样的慢速设备,这会极大地影响下载速度。我可以以6MB/s的速度下载到我的硬盘,以700kb/s的速度下载到我的U盘,即使我可以从另一个驱动器以5MB/s的速度将文件复制到这个U盘。wget显示了相同的行为。这里也有报道:


因此,如果这是您的情况,另一种解决方案是先下载到HDD,然后在下载完成后将文件复制到慢速介质。

设置
WebRequest.DefaultWebProxy=null
client.Proxy=null
没有为我做任何事,在iOS上使用Xamarin

我做了两件事来解决这个问题:

我编写了一个downloadString函数,它不使用WebRequest和System.Net:

公共静态异步任务FNLowloadStringWithingWebRequest(字符串url)
{
使用(var client=new HttpClient())
{
//定义标题
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var response=wait client.GetAsync(url);
if(响应。IsSuccessStatusCode)
{
string responseContent=await response.Content.ReadAsStringAsync();
//动态json=Newtonsoft.json.JsonConvert.DeserializeObject(responseContent);
返回响应内容;
}
Logger.DefaultLogger.LogError(LogLevel.NORMAL,“GoogleLoginManager.FnDownloadString”,“获取字符串时出错,代码:“+response.StatusCode”);
返回“”;
}
}
但是,托管HttpClient的速度仍然很慢

因此其次,在Visual Studio Community for Mac中,右键单击解决方案->选项->中的项目,将HttpClient实现设置为NSUrlSession,而不是Managed

Managed未完全集成到iOS中,不支持TLS 1.2,因此不支持在iOS9+中设置为默认值的ATS标准,请参见此处:


通过这两种更改,字符串下载总是非常快(wireshark上没有奇怪的显示,但通过跟踪打印,我可以看到调用WebClient.DownloadData(),并且直到大约10-30秒后,GET请求才出现在wireshark上(取决于“冻结”时间)。看起来使其变慢的不是请求本身,而是在实际GET请求之前完成的某项操作。看起来您的客户端正在等待某项操作的超时。大部分时间,它都在等待DNS超时或NetBIOS超时。您可以尝试筛选DNS数据包和NetBIOS数据包。或者,您可以尝试按源IP地址过滤。这应该会告诉你在GET-reqest之前客户端发送的最后一个数据包是什么。也许,@Breaked Pipe是对的。它可能正在等待代理。我这样做时速度得到了巨大提升。谢谢!第二个数据包对我的情况产生了巨大的影响!这绝对是减速“功能”这些WebProxies.H