Медленное выполнение WebClient в C# .Net

3 Фев
2012

Не так давно я столкнулся с проблемой, долго выполняется следующий код, выводящий ваш ip адрес.
 System.Net.WebClient web = new System.Net.WebClient();
Console.WriteLine(web.DownloadString("http://ip.genuh.ru"));

Долгое выполнение только при первом запросе. Странно, если медленный интернет — все запросы будут немного похожи. Но разница между первым запросом и вторым — очень большая. И сайт не слишком весомый. Максимум 15 символов. Почему же так? Попробуем разобраться.
 System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch(); 
timer.Start();
System.Net.WebClient web = new System.Net.WebClient();
Console.WriteLine(web.DownloadString("http://ip.genuh.ru/"));
timer.Stop();
Console.WriteLine(timer.Elapsed.ToString());
timer.Reset();
timer.Start();
Console.WriteLine(web.DownloadString("http://ip.genuh.ru/"));
timer.Stop();
Console.WriteLine(timer.Elapsed.ToString());


Первый запрос: 13.9691268 секунд.
Второй запрос: 00.1283174 секунд.

Почитав несколько иностранных форумов и конечно же MDSN, перепробовав много методов, я понял в чем проблема.
Оказывается, что при первом запросе WebClient берет Proxy из конфигурационных файлов Internet Explorer. Если мы уверены, что не будем использовать прокси, то требуется указать это.
 System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
timer.Start();
System.Net.WebClient web = new System.Net.WebClient();
web.Proxy = new System.Net.WebProxy();//Строка с помощью которой мы решаем проблему.
Console.WriteLine(web.DownloadString("http://habrahabr.ru"));
timer.Stop();
Console.WriteLine(timer.Elapsed.ToString());


Первый запрос: 00.3665608 секунд.

Проблема решена с помощью указания правильных опций объявляемых классов.

Подробнее про WebClient.Proxy

Спасибо за внимание!
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх