Webresponse / Webrequest не работает - PullRequest
0 голосов
/ 11 февраля 2012

Моя программа использует WebRequest и WebResponse для загрузки файла HTML с заданного URL-адреса в итерации. Например, строка URL будет выглядеть примерно так:

http://www.aaaa.com/cccc=varB

где varB - отдельная строка для каждой итерации цикла.

После загрузки файла в поток он будет искать в потоке определенные строки текста и сохранять их в отдельном текстовом файле. Однако я обнаружил, что на некоторых итерациях кажется, что он ничего не читает (строка URL для него действительна при вводе в адресную строку, поэтому это не недействительный URL).

Я помещаю потоки и WebResponse объекты в блоки using, и у меня также есть блок try…catch, но исключений не возникает. Проблематично ли использование WebRequest и WebResponse в циклах?

try
{
    foreach (string name in names)
    {
        string urlstr = "…"; // URL format like I mentioned earlier

        HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(urlstr);
        myRequest.Timeout = 30000;

        //store the response in myResponse 
        using (HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse())
        {
            //register I/O stream associated with myResponse
            using (Stream myStream = myResponse.GetResponseStream())
            {
                //create StreamReader that reads characters one at a time
                using (StreamReader myReader = new StreamReader(myStream))
                {
                    myReader.ReadLine();
                    sw.WriteLine(name + " " + myReader.ReadLine());
                }
            }
        }
    }

    sw.Close();
}

Результат будет выглядеть примерно так:

name1 stuffReadfromfile
name2 stuffReadfromfile
name3 stuffReadfromfile
name4                        
name5 stuffReadfromfile
name6 
name7 stuffReadfromfile
name8 stuffReadfromfile
name9 
name10 stuffReadfromfile

, хотя после каждого имени должно быть stuffReadfromfile.

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Две вещи здесь:

Сначала: попробуйте прочитать весь ответ в строке, а затем обработать строку, используя ReadToEnd ():

//create StreamReader that reads characters one at a time
using (StreamReader myReader = new StreamReader(myStream))
{
    string content = myReader.ReadToEnd();
    // Process content
}

И второе: попробуйте установить request.CachePolicy, чтобы вы всегда были уверены, что получаете последний контент с сервера.

Я согласен с приведенным выше комментарием о проверке кода состояния, прежде чем делать что-либо с контентом.

Надеюсь, что поможет

0 голосов
/ 11 февраля 2012

Я бы использовал что-то вроде Fiddler, чтобы узнать, что на самом деле происходит - возвращаются ли ожидаемые вами данные с сервера.Кстати, почему вы вызываете ReadLine () дважды - в некоторых случаях первый вызов не может проглотить ваши данные?

...