C#、WebClient 和 Windows Server 2008

C#、WebClient 和 Windows Server 2008

我在 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 也使用基于事件的异步编程模型,您可能希望考虑使用它。

相关内容