Вот цель моей консольной программы: сделать веб-запрос> Сохранить результаты из веб-запроса> Использовать QueryString для получения следующей страницы из веб-запроса> Сохранить эти результаты> Использовать QueryString для получения следующей страницы из веб-запроса и т. д.
Итак, вот какой-то псевдокод того, как я настраиваю код.
for (int i = 0; i < 3; i++)
{
strPageNo = Convert.ToString(i);
//creates the url I want, with incrementing pages
strURL = "http://www.website.com/results.aspx?page = " + strPageNo;
//makes the web request
wrGETURL = WebRequest.Create(strURL);
//gets the web page for me
objStream = wrGETURL.GetResponse().GetResponseStream();
//for reading web page
objReader = new StreamReader(objStream);
//--------
// -snip- code that saves it to file, etc.
//--------
objStream.Close();
objReader.Close();
//so the server doesn't get hammered
System.Threading.Thread.Sleep(1000);
}
Довольно просто, правда? Проблема в, даже если он увеличивает номер страницы, чтобы получить другую веб-страницу, я получаю точно такая же страница результатов каждый раз при запуске цикла.
i правильно увеличивается, и я могу вырезать / вставить URL-адрес, созданный strURL, в веб-браузер, и он работает нормально.
Я могу вручную ввести &page=1, &page=2, &page=3, и он вернет правильные страницы. Каким-то образом добавление туда инкремента все портит.
Это как-то связано с сессиями, что ли? Я проверяю, что закрываю и поток, и читатель, прежде чем он снова зациклится ...
Удалось ли вам когда-нибудь решить эту проблему? [email protected]





Этот URL-адрес для меня не совсем понятен, если вы не используете MVC или что-то, что может правильно интерпретировать строку запроса.
http://www.website.com/results.aspx&page=
должно быть:
http://www.website.com/results.aspx?page=
Некоторые браузеры принимают плохо сформированные URL-адреса и обрабатывают их нормально. Другие могут не быть, что может быть проблемой с вашим консольным приложением.
Я подделал псевдокод. В моей программе это правильно. В чем еще может быть проблема?
Какой пользовательский агент видит сервер из консольной программы? Возможно, сервер обрабатывает запрос ни от чего иначе, чем запрос от определенного браузера. Существует также вопрос, насколько хорошо программа разрешает DNS веб-запроса, который может быть чем-то ...
Пробовали ли вы создавать новый объект WebRequest каждый раз во время цикла, возможно, метод Create () не удаляет должным образом все свои старые данные.
Еще одна вещь, которую следует проверить, - это то, что ResponseStream должным образом очищается перед следующей итерацией цикла.
Я не могу создать новый объект WebRequest, потому что получаю сообщение «это метод», а вы используете его как ошибку типа. Я поместил метод objStream.Flush () в конец цикла, но безуспешно :(
Просто предложение, попробуйте избавиться от Stream и Reader. Я видел несколько странных случаев, когда не выбрасывать подобные объекты и не использовать их в циклах может привести к дурацким результатам ...
Я добавил objStream / objReader.Dispose () в конец цикла, но безуспешно :( Я даже воспользовался советом Dillie-O и поставил objStream.Flush () в конце, но это тоже не помогло ...
Этот код отлично работает для меня:
var urls = new [] { "http://www.google.com", "http://www.yahoo.com", "http://www.live.com" };
foreach (var url in urls)
{
WebRequest request = WebRequest.Create(url);
using (Stream responseStream = request.GetResponse().GetResponseStream())
using (Stream outputStream = new FileStream("file" + DateTime.Now.Ticks.ToString(), FileMode.Create, FileAccess.Write, FileShare.None))
{
const int chunkSize = 1024;
byte[] buffer = new byte[chunkSize];
int bytesRead;
while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
byte[] actual = new byte[bytesRead];
Buffer.BlockCopy(buffer, 0, actual, 0, bytesRead);
outputStream.Write(actual, 0, actual.Length);
}
}
Thread.Sleep(1000);
}
Вот мое ужасное обходное решение:
Создайте другое консольное приложение, которое вызывает ЭТО, в котором первое консольное приложение передает аргумент в конце strURL. Это работает, но я чувствую себя такой грязной.
Плохой. Найдите эту строку в своем коде (которая не показана) WebRequest wrGETURL; Поместите эту строчку ВНУТРИ своей петли. Теперь все будет в порядке с миром. Кстати, это то, что говорила Дилли-О.
Ха-ха, он просто открывает средство чтения потоков и сохраняет его в текстовом документе.