我在 Windows Server 2008 上使用 WebClient 类时遇到了大问题。我有一些使用 WebClient.DownloadFile/DownloadData 方法从 Web 下载数据的小代码。在 Windows 2003 和 Windows 7 上一切正常,但在 Windows Server 2008 上却不行。在 2008 上,我的速度非常慢(大约 5kb/s,而正常情况下大约 1mb/s)。
我做了一些研究和检查: - 问题仅存在于几台服务器上(不是每台,其中一台是 newconnect.pl -> 示例文件http://newconnect.pl/index.php?page=get_ebi_file&id=6023), - 我检查了几个 2008 服务器 - 不同的机器,不同的网络连接 - 每个服务器都存在问题。 - 我尝试将代理设置为 null 或空 - 没有帮助 - 我使用 wireshark 来检查出了什么问题 - 我没有发现任何奇怪的事情,只是速度变慢了。 - 如果我在 windows 2008 上创建一个带有 windows 2003 的虚拟机并在 win2k3 上安装下载程序,它可以正常工作。
感谢帮助。
代码:
class Program
{
static void Main(string[] args)
{
string file1 = "http://newconnect.pl/index.php?page=get_espi_file&file=zal_7161967.pdf";
string file2 = "http://newconnect.pl/index.php?page=get_espi_file&file=zal_7163706.pdf";
WebClient wc = new WebClient();
wc.Proxy = null;
Console.WriteLine(DateTime.Now.ToString());
wc.DownloadData(file1);
Console.WriteLine(DateTime.Now.ToString());
wc.DownloadData(file2);
Console.WriteLine(DateTime.Now.ToString());
Console.Read();
}
}
}
答案1
我的博客上有一篇博客文章,介绍了如何使用 HttpWebRequest 和异步类(为了提高性能)执行多个 http 请求。 HttpWebRequest - 异步编程模型/Task.Factory.FromAsyc
现在,您可能不太愿意使用异步编程,但尽管如此,您仍需要更改一些设置才能获得 2 个以上同时的 http 类,这也在我上面链接的帖子中进行了解释。具体来说,您需要修改 ServicePointManager 的 DefaultConnectionLimit 属性(默认情况下设置为每个域 2 个)。
因此,如果您多次调用同一个域,则将此值更改为更大的数字将对您看到的性能产生巨大影响。
由于发出 http 请求和下载文件纯粹是 I/O 工作负载,因此您也应该认真考虑在您的案例中使用异步调用。我在文章中展示了多个示例/样式,您可以使用。甚至 WebClient 也使用基于事件的异步编程模型,您可能希望考虑使用它。