Строка загрузки WebClient (страница из нескольких символов) такая медленная

Я пытаюсь загрузить строку с URL-адреса. К сожалению, очень медленно.

Вот мой код:

    // One of these types for two bad solutions anyway
    // byte[] result = new byte[12];
    // string result;
    using (var webClient = new System.Net.WebClient())
    {
        String url = "http://bg2.cba.pl/realmIP.txt";
        //result = webClient.DownloadString(url); // slow as hell
        //webClient.OpenRead(url).Read(result, 0, 12); // even slower
    }

Это занимает около 4-5 секунд, что мне кажется очень неуместным...

Содержание этого URL-адреса IP

 XX.YYY.ZZ.FF

person Bartłomiej Sobieszek    schedule 22.12.2014    source источник
comment
Вы использовали Wireshark или что-то подобное, чтобы увидеть, куда идет время?   -  person Jon Skeet    schedule 22.12.2014
comment
Я не использовал WS, потому что не знаю, как с ним работать.   -  person Bartłomiej Sobieszek    schedule 22.12.2014
comment
@BartłomiejSobieszek прочитал в Wireshark, а затем   -  person Sybren    schedule 22.12.2014
comment
Я только что проверил ваш код, он работает так быстро, как должен. У вас есть брандмауэр или что-то посередине?   -  person Bongo    schedule 22.12.2014
comment
Хорошо, я исправил это, мне пришлось установить прокси как нуль :)   -  person Bartłomiej Sobieszek    schedule 22.12.2014


Ответы (3)


Исправлено, извините, что поставил этот вопрос здесь, я думаю, но... вот рабочий код

string result;
using (var webClient = new System.Net.WebClient())
{
    webClient.Proxy=null;
    String url = "http://bg2.cba.pl/realmIP.txt";
    result = webClient.DownloadString(url);
}

Просто установите для прокси значение null

person Bartłomiej Sobieszek    schedule 22.12.2014
comment
используйте GlobalProxySelection.GetEmptyWebProxy() вместо нуля. прочитайте мой ответ для более подробной информации - person giammin; 23.12.2014
comment
Мне пришлось использовать client.Proxy = null; чтобы мой код работал быстрее. (С#) - person nolimits; 25.12.2019
comment
веб-клиент.Прокси=нуль; это работает для меня - person Sunil Dabhi; 27.04.2021

Это явно проблема с вашей линией/компьютером/брандмауэром

Вы можете протестировать его онлайн:

http://goo.gl/XRqLjn

это занимает около 500 миллисекунд

введите здесь описание изображения

ОБНОВИТЬ после вашего собственного ответа

Если вы не хотите использовать прокси-сервер, вам следует использовать GetEmptyWebProxy(), как указано в msdn:

webClient.Proxy=GlobalProxySelection.GetEmptyWebProxy();
person giammin    schedule 22.12.2014
comment
Примечание. Несмотря на то, что GlobalProxySelection.GetEmptyWebProxy() устарел, это единственный способ ускорить запросы WebClient. Если кто-нибудь знает какой-либо неустаревший способ достижения такого же поведения, сообщите мне. - person Elad Nava; 01.10.2015
comment
они рекомендуют установить .Proxy на null сейчас - person hanzolo; 15.08.2018

Я попробовал ваш код и добавил к нему некоторый вывод.

        using (var webClient = new System.Net.WebClient())
        {
            Stopwatch timer = Stopwatch.StartNew();
            String url = "http://bg2.cba.pl/realmIP.txt";
            timer.Stop();
            TimeSpan timespan = timer.Elapsed;
            String tex1 = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);


            timer = Stopwatch.StartNew();
            String result = webClient.DownloadString(url); // slow as hell
            timespan = timer.Elapsed;
            String tex2 = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);


            timer = Stopwatch.StartNew();
            Stream stream = webClient.OpenRead(url);
            timespan = timer.Elapsed;
            String tex3 = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);

            timer = Stopwatch.StartNew();
            byte[] result2 = new byte[12];
            int val = webClient.OpenRead(url).Read(result2, 0, 12); // even slower
            timespan = timer.Elapsed;
            String tex4 = String.Format("{0:00}:{1:00}:{2:00}", timespan.Minutes, timespan.Seconds, timespan.Milliseconds / 10);

            textBox1.Text = result;
            t1.Text = tex1;
            t2.Text = tex2;
            t3.Text = tex3;
            t4.Text = tex4;
        }

со следующим результатом

введите здесь описание изображения

Ваш код, кажется, в порядке. Проверьте свой брандмауэр и все, что с ним связано

person Bongo    schedule 22.12.2014