我的程序使用WebRequest
和WebResponse
,以便在迭代中从给定的URL下载HTML文件。例如,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
。
答案 0 :(得分:1)
这里有两件事:
首先:尝试在字符串中读取整个响应,然后使用ReadToEnd()处理字符串:
//create StreamReader that reads characters one at a time
using (StreamReader myReader = new StreamReader(myStream))
{
string content = myReader.ReadToEnd();
// Process content
}
第二件事:尝试设置request.CachePolicy,以便始终确保从服务器获取最新内容。
我同意上述关于在您对内容做任何事情之前检查状态代码的评论。
希望有所帮助
答案 1 :(得分:0)
我会使用类似Fiddler的东西来了解实际发生的事情 - 您期望的数据是否从服务器返回。 顺便说一句,你为什么要两次调用ReadLine() - 在某些情况下,第一次调用是否不能吞下你的数据?