System.Net.WebClient不合理地慢

时间:2010-12-11 05:58:22

标签: c# .net performance http

使用System.Net.WebClient.DownloadData()方法时,我的响应时间会非常慢。

在.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);
}

8 个答案:

答案 0 :(得分:77)

我遇到了WebRequest的问题。尝试设置Proxy = null;

    WebClient wc = new WebClient();
    wc.Proxy = null;

默认情况下,WebClient会尝试确定从IE设置中使用的代理,有时会在发送实际请求之前导致5秒延迟。

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

WebRequest.DefaultWebProxy = null;

答案 1 :(得分:2)

在这里下载Wireshark http://www.wireshark.org/

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

答案 2 :(得分:1)

设置<{1>}或WebRequest.DefaultWebProxy = null;对我没有任何帮助,在iOS上使用Xamarin

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

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

client.Proxy = null

但是对于托管HttpClient,这仍然很慢。

因此,其次,在Mac的Visual Studio社区中,在解决方案->选项-> HttpClient实现设置为NSUrlSession上,右键单击您的项目。托管

Screenshot: Set HttpClient implementation to NSUrlSession instead of Managed

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

https://docs.microsoft.com/en-us/xamarin/ios/app-fundamentals/ats

通过这两个更改,字符串下载始终非常快(<< 1s)。 如果没有这两个更改,则每隔第二或第三次尝试,downloadString就会花费一分钟。


仅供参考,您还可以尝试做一件事,尽管不再需要

        public static async Task<string> FnDownloadStringWithoutWebRequest(string url)
        {
            using (var client = new HttpClient())
            {
                //Define Headers
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var response = await client.GetAsync(url);

                if (response.IsSuccessStatusCode)
                {
                    string responseContent = await response.Content.ReadAsStringAsync();
                    //dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(responseContent);
                    return responseContent;
                }
                Logger.DefaultLogger.LogError(LogLevel.NORMAL, "GoogleLoginManager.FnDownloadString", "error fetching string, code: " + response.StatusCode);
                return "";
            }
        }

尽管根据我的经验,您可能不需要SafariController。

答案 3 :(得分:0)

.NET Web请求本身并没有什么缓慢的;该代码应该没问题。我经常使用WebClient,但效果很快。

每个方向的有效载荷有多大?愚蠢的问题可能,但它只是带宽限制?

IMO最可能的事情是您的网站已经停止运转,当您点击网址时,网站的响应速度很慢。这不是客户的错。由于某些原因,DNS也可能很慢(在这种情况下,您可以将IP硬编码到“主机”文件中),或者中间的某个代理服务器很慢。

如果该网站不属于您,那么他们也可能会检测到非典型用途并故意注意延迟来惹恼刮刀。

我会抓住Fiddler(一个免费,简单的网络检查员)并查看时间。

答案 4 :(得分:0)

Wireshark的另一个替代方案(也是免费的)是Microsoft Network Monitor

答案 5 :(得分:0)

您使用什么浏览器进行测试?

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

答案 6 :(得分:0)

在IE设置(连接选项卡 - 局域网设置)中选中自动代理设置时,某些工作站上的WebClient可能会变慢。

答案 7 :(得分:0)

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

https://superuser.com/questions/413750/why-is-downloading-over-usb-so-slow

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