Pull to refresh

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

Не так давно я столкнулся с проблемой, долго выполняется следующий код, выводящий ваш 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

Спасибо за внимание!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.