HttpWebResponse + StreamReader = завес
От: Freid  
Дата: 27.07.13 22:15
Оценка:
Приветствую.

Я делаю банальную функцию загрузки страницы по HTTP протоколу:

HttpWebRequest Req = (HttpWebRequest)HttpWebRequest.Create(sUrl);

Req.ReadWriteTimeout = 30000;
...
Resp = (HttpWebResponse)Req.GetResponse();

using (Stream = new StreamReader(Resp.GetResponseStream(), Encoding.UTF8))
{
    try
    {
        sPage = Stream.ReadToEnd();
    }
    catch (Exception e)
    {
        bRet = false;
    }

    if (Stream != null)
       Stream.Close();
    if (Resp != null)
       Resp.Close();
}
...


В подавляющем большинстве случаев эта конструкция работает прекрасно, но есть страница, где ReadToEnd() виснет намертво и вываливается в исключение с ошибкой по поводу истечения таймаута. Сама страница не большая — всего несколько килобайт, любой браузер загружает ее за пару секунд без каких-либо проблем.

Вместо ReadToEnd() я пробовал: ReadLine(), Read(), ReadBlock() в цикле и все с тем же результатом, при чем часть страницы загружается, после чего чтение обрывается в произвольном месте, всегда по-разному. Иногда, в очень редких случаях, страница загружается полностью.

Что это может быть??? Хваленый дотнет не в состоянии загрузить элементарную веб-страницу?! Гугление не принесло никаких результатов тоже. Создается впечатление, что мне придется все это реализовывать на сокетах, но как-то совсем не хочется. Кто-нибудь сталкивался с подобной проблемой? В чем тут проблема? Посоветуйте, пожалуйста, решение.
.net streamreader зависает
Re: HttpWebResponse + StreamReader = завес
От: herethere  
Дата: 27.07.13 22:56
Оценка: +2
Здравствуйте, Freid, Вы писали:

F>есть страница, где ReadToEnd() виснет намертво... любой браузер загружает ее за пару секунд без каких-либо проблем.

F>Что это может быть??? Хваленый дотнет не в состоянии загрузить элементарную веб-страницу?!

Попробуй запрашивать страницу со всеми параметрами, которые выдаёт браузер. Если сервер считает эти параметры обязательно присутствующими и проверяет их, а ты их не передал, может возникнуть конфуз и таймаут.
Re: HttpWebResponse + StreamReader = завес
От: cvetkov  
Дата: 28.07.13 05:21
Оценка:
попробуй по снифить трафик. убедись что сервер все отдает.
... << RSDN@Home 1.2.0 alpha 5 rev. 1539>>
Re[2]: HttpWebResponse + StreamReader = завес
От: Freid  
Дата: 28.07.13 09:13
Оценка:
Здравствуйте, herethere, Вы писали:

H>Попробуй запрашивать страницу со всеми параметрами, которые выдаёт браузер. Если сервер считает эти параметры обязательно присутствующими и проверяет их, а ты их не передал, может возникнуть конфуз и таймаут.


Это и так уже сделано. К тому же, если бы отсутствовали какие-то параметры, то сервер вообще ничего бы не выдавал, а так часть страницы все-таки приходит.

На всякий случай, вот он урл: http://newyork.craigslist.org/roo/
Re: Попробуй явно задать буфер
От: igor-booch Россия  
Дата: 28.07.13 09:35
Оценка:
        static byte[] _buffer = new byte[1024 * 1024];
...
                using (Stream sourceStream = httpWebResponse.GetResponseStream())
                {
                    using (MemoryStream memoryStream = new MemoryStream())
                    {
                        int readCount = sourceStream.Read(_buffer, 0, _buffer.Length);
                        while (readCount > 0)
                        {
                            memoryStream.Write(_buffer, 0, readCount);
                            readCount = sourceStream.Read(_buffer, 0, _buffer.Length);
                        }
                    }
                }



ReadToEnd assumes that the stream knows when it has reached an end. For interactive protocols in which the server sends data only when you ask for it and does not close the connection, ReadToEnd might block indefinitely because it does not reach an end, and should be avoided.
Note that when using the Read method, it is more efficient to use a buffer that is the same size as the internal buffer of the stream. If the size of the buffer was unspecified when the stream was constructed, its default size is 4 kilobytes (4096 bytes).

Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[3]: HttpWebResponse + StreamReader = завес
От: BrainSlug Израиль  
Дата: 28.07.13 09:37
Оценка:
F>На всякий случай, вот он урл: http://newyork.craigslist.org/roo/
используйте fiddler + плагин к нему, который генерирует код. попробуйте этот код. да и причем здесь хваленный дотнет — вы сетевой шнур из компьютера вытащите и не только дотнет не сможет ничего сделать. т.е. пока вы не разберетесь в чем дело, наезд на дотнет непонятен.
.
Re[3]: HttpWebResponse + StreamReader = завес
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.07.13 10:08
Оценка: +2
Здравствуйте, Freid, Вы писали:

F>На всякий случай, вот он урл: http://newyork.craigslist.org/roo/


Читал http://www.craigslist.org/about/terms.of.use ? Особенно п.5?
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re[4]: HttpWebResponse + StreamReader = завес
От: Freid  
Дата: 28.07.13 12:35
Оценка: -2
Здравствуйте, AndrewVK, Вы писали:

AVK>Здравствуйте, Freid, Вы писали:


F>>На всякий случай, вот он урл: http://newyork.craigslist.org/roo/


AVK>Читал http://www.craigslist.org/about/terms.of.use ? Особенно п.5?


Браузер загружает эту страницу без всяких terms of use. Это самая обычная текстовая страница.
Re[5]: HttpWebResponse + StreamReader = завес
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.07.13 14:54
Оценка: +1
Здравствуйте, Freid, Вы писали:

F>Браузер загружает эту страницу


Браузер много чего может делать, например хидеры интересные выставлять или JS выполнять.

F>без всяких terms of use.


Это правила использования сервиса. Будешь их игнорировать — тебя просто забанят. Ты думаешь один ты такой умный?
... << RSDN@Home 1.2.0 alpha 5 rev. 100 on Windows 8 6.2.9200.0>>
AVK Blog
Re: HttpWebResponse + StreamReader = завес
От: pavel783  
Дата: 29.07.13 09:00
Оценка:
это wireshark или fiddler решается, сама страница может и чанками возвращаться
Re[6]: HttpWebResponse + StreamReader = завес
От: Freid  
Дата: 29.07.13 09:10
Оценка: -2 :)
Здравствуйте, AndrewVK, Вы писали:

AVK>Это правила использования сервиса. Будешь их игнорировать — тебя просто забанят. Ты думаешь один ты такой умный?


Вы говорите глупости, которые, тем более, не имеют никакого отношения к исходной проблеме.
Re: HttpWebResponse + StreamReader = завес
От: Sinclair Россия https://github.com/evilguest/
Дата: 01.08.13 11:10
Оценка:
Здравствуйте, Freid, Вы писали:

F>Что это может быть??? Хваленый дотнет не в состоянии загрузить элементарную веб-страницу?! Гугление не принесло никаких результатов тоже. Создается впечатление, что мне придется все это реализовывать на сокетах, но как-то совсем не хочется. Кто-нибудь сталкивался с подобной проблемой? В чем тут проблема? Посоветуйте, пожалуйста, решение.

Начать надо с того, что поставить http://fiddlertool.com.
Затем посмотреть на то, как выглядит обмен данными с сервисом из-под браузера.
Затем — из-под вашей программы.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.