Назад | Перейти на главную страницу

C #, WebClient и Windows Server 2008

У меня большая проблема с классом WebClient в Windows Server 2008. У меня есть небольшой код, который загружает данные из Интернета с помощью метода WebClient.DownloadFile / DownloadData. Все работает нормально в Windows 2003 и Windows 7, но не в Windows Server 2008. В 2008 году у меня очень низкая скорость (около 5 кбит / с, тогда как обычно у меня около 1 МБ / с).

Я провел небольшое исследование и проверку: - проблема существует только на нескольких серверах (не на всех, один из них newconnect.pl -> файл примера http://newconnect.pl/index.php?page=get_ebi_file&id=6023), - я проверил пару серверов с 2008 года - разные машины, разные сетевые подключения - проблема существовала на каждом из них. - Я пробовал трюк с установкой прокси-сервера на ноль или пустой - не помогло - я использовал wirehark, чтобы проверить, что не так - я не заметил ничего странного, только более низкая скорость. - если я создаю виртуальную машину с Windows 2003 на Windows 2008 и устанавливаю загрузчик на 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();
    }
}

}

У меня есть сообщение в моем блоге, в котором выполняется несколько HTTP-запросов с использованием HttpWebRequest и асинхронного класса (для производительности). HttpWebRequest - модель асинхронного программирования / Task.Factory.FromAsyc

Нет, возможно, вы не хотите использовать асинхронное программирование, но, тем не менее, есть некоторые настройки, которые вам нужно изменить, чтобы получить более двух одновременных http-классов, и это также объясняется в сообщении, на которое я ссылался выше. В частности, вам необходимо изменить свойство DefaultConnectionLimit ServicePointManager (по умолчанию для каждого домена установлено значение 2).

Поэтому, если вы вызываете один и тот же домен несколько раз, то изменение этого значения на большее число существенно повлияет на производительность, которую вы видите.

Поскольку выполнение HTTP-запросов и загрузка файлов являются чисто рабочими нагрузками ввода-вывода, вам следует серьезно подумать об использовании асинхронных вызовов и в вашем случае. В этом посте я показал несколько примеров / стилей, которые вы могли бы использовать. Даже WebClient использует модель программирования Async на основе событий, которую вы, возможно, захотите использовать.