使用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);
}
答案 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,然后在下载完成后将文件复制到慢速介质。