C# - WebRequest не возвращает разные страницы

Вот цель моей консольной программы: сделать веб-запрос> Сохранить результаты из веб-запроса> Использовать 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, и он вернет правильные страницы. Каким-то образом добавление туда инкремента все портит.

Это как-то связано с сессиями, что ли? Я проверяю, что закрываю и поток, и читатель, прежде чем он снова зациклится ...

Ха-ха, он просто открывает средство чтения потоков и сохраняет его в текстовом документе.

MattSayar 26.11.2008 00:04

Удалось ли вам когда-нибудь решить эту проблему? [email protected]

vbNewbie 17.07.2010 18:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
877
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Этот URL-адрес для меня не совсем понятен, если вы не используете MVC или что-то, что может правильно интерпретировать строку запроса.

http://www.website.com/results.aspx&page=

должно быть:

http://www.website.com/results.aspx?page=

Некоторые браузеры принимают плохо сформированные URL-адреса и обрабатывают их нормально. Другие могут не быть, что может быть проблемой с вашим консольным приложением.

Я подделал псевдокод. В моей программе это правильно. В чем еще может быть проблема?

MattSayar 26.11.2008 00:02

Какой пользовательский агент видит сервер из консольной программы? Возможно, сервер обрабатывает запрос ни от чего иначе, чем запрос от определенного браузера. Существует также вопрос, насколько хорошо программа разрешает DNS веб-запроса, который может быть чем-то ...

JB King 26.11.2008 19:34
Ответ принят как подходящий

Пробовали ли вы создавать новый объект WebRequest каждый раз во время цикла, возможно, метод Create () не удаляет должным образом все свои старые данные.

Еще одна вещь, которую следует проверить, - это то, что ResponseStream должным образом очищается перед следующей итерацией цикла.

Я не могу создать новый объект WebRequest, потому что получаю сообщение «это метод», а вы используете его как ошибку типа. Я поместил метод objStream.Flush () в конец цикла, но безуспешно :(

MattSayar 26.11.2008 00:20

Просто предложение, попробуйте избавиться от Stream и Reader. Я видел несколько странных случаев, когда не выбрасывать подобные объекты и не использовать их в циклах может привести к дурацким результатам ...

Я добавил objStream / objReader.Dispose () в конец цикла, но безуспешно :( Я даже воспользовался советом Dillie-O и поставил objStream.Flush () в конце, но это тоже не помогло ...

MattSayar 26.11.2008 00:21

Этот код отлично работает для меня:

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; Поместите эту строчку ВНУТРИ своей петли. Теперь все будет в порядке с миром. Кстати, это то, что говорила Дилли-О.

Matt Dawdy 07.09.2009 22:20

Другие вопросы по теме