C # - WebRequest не возвращает разные страницы - PullRequest
0 голосов
/ 25 ноября 2008

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

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

Ответы [ 5 ]

4 голосов
/ 26 ноября 2008

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

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

2 голосов
/ 26 ноября 2008

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

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);
}
1 голос
/ 26 ноября 2008

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

0 голосов
/ 26 ноября 2008

Вот мое ужасное, обходное, обходное решение:

Создайте другое консольное приложение, которое вызывает это, в котором первое консольное приложение передает аргумент в конце strURL. Это работает, но я чувствую себя таким грязным.

0 голосов
/ 25 ноября 2008

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

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

должно быть:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...