В подавляющем большинстве случаев эта конструкция работает прекрасно, но есть страница, где ReadToEnd() виснет намертво и вываливается в исключение с ошибкой по поводу истечения таймаута. Сама страница не большая — всего несколько килобайт, любой браузер загружает ее за пару секунд без каких-либо проблем.
Вместо ReadToEnd() я пробовал: ReadLine(), Read(), ReadBlock() в цикле и все с тем же результатом, при чем часть страницы загружается, после чего чтение обрывается в произвольном месте, всегда по-разному. Иногда, в очень редких случаях, страница загружается полностью.
Что это может быть??? Хваленый дотнет не в состоянии загрузить элементарную веб-страницу?! Гугление не принесло никаких результатов тоже. Создается впечатление, что мне придется все это реализовывать на сокетах, но как-то совсем не хочется. Кто-нибудь сталкивался с подобной проблемой? В чем тут проблема? Посоветуйте, пожалуйста, решение.
Здравствуйте, Freid, Вы писали:
F>есть страница, где ReadToEnd() виснет намертво... любой браузер загружает ее за пару секунд без каких-либо проблем. F>Что это может быть??? Хваленый дотнет не в состоянии загрузить элементарную веб-страницу?!
Попробуй запрашивать страницу со всеми параметрами, которые выдаёт браузер. Если сервер считает эти параметры обязательно присутствующими и проверяет их, а ты их не передал, может возникнуть конфуз и таймаут.
Здравствуйте, herethere, Вы писали:
H>Попробуй запрашивать страницу со всеми параметрами, которые выдаёт браузер. Если сервер считает эти параметры обязательно присутствующими и проверяет их, а ты их не передал, может возникнуть конфуз и таймаут.
Это и так уже сделано. К тому же, если бы отсутствовали какие-то параметры, то сервер вообще ничего бы не выдавал, а так часть страницы все-таки приходит.
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
F>На всякий случай, вот он урл: http://newyork.craigslist.org/roo/
используйте fiddler + плагин к нему, который генерирует код. попробуйте этот код. да и причем здесь хваленный дотнет — вы сетевой шнур из компьютера вытащите и не только дотнет не сможет ничего сделать. т.е. пока вы не разберетесь в чем дело, наезд на дотнет непонятен.
Здравствуйте, AndrewVK, Вы писали:
AVK>Это правила использования сервиса. Будешь их игнорировать — тебя просто забанят. Ты думаешь один ты такой умный?
Вы говорите глупости, которые, тем более, не имеют никакого отношения к исходной проблеме.
Здравствуйте, Freid, Вы писали:
F>Что это может быть??? Хваленый дотнет не в состоянии загрузить элементарную веб-страницу?! Гугление не принесло никаких результатов тоже. Создается впечатление, что мне придется все это реализовывать на сокетах, но как-то совсем не хочется. Кто-нибудь сталкивался с подобной проблемой? В чем тут проблема? Посоветуйте, пожалуйста, решение.
Начать надо с того, что поставить http://fiddlertool.com.
Затем посмотреть на то, как выглядит обмен данными с сервисом из-под браузера.
Затем — из-под вашей программы.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.