C# Webresponse/Webrequest不工作
我的程序使用C# Webresponse/Webrequest不工作,c#,webrequest,webresponse,C#,Webrequest,Webresponse,我的程序使用WebRequest和WebResponse在迭代中从给定URL下载HTML文件。例如,URL字符串看起来像 http://www.aaaa.com/cccc=varB 其中,varB是循环中每个迭代的不同字符串 将文件下载到流中后,它将在流中搜索特定的文本字符串,并将它们存储到单独的文本文件中。然而,我发现在某些迭代中,它似乎没有读取任何内容(当我在地址栏中键入它时,它的URL字符串是有效的,因此它不是无效的URL) 我使用块将流和WebResponse对象放入中,我还有一个try
WebRequest
和WebResponse
在迭代中从给定URL下载HTML文件。例如,URL字符串看起来像
http://www.aaaa.com/cccc=
varB
其中,varB
是循环中每个迭代的不同字符串
将文件下载到流中后,它将在流中搜索特定的文本字符串,并将它们存储到单独的文本文件中。然而,我发现在某些迭代中,它似乎没有读取任何内容(当我在地址栏中键入它时,它的URL字符串是有效的,因此它不是无效的URL)
我使用块将流和WebResponse
对象放入中,我还有一个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
。我也会使用类似Fiddler的东西来了解实际发生的情况-您所期望的数据是否从服务器返回。
顺便说一句,为什么要调用ReadLine()两次?在某些情况下,第一次调用不能吞掉您的数据吗?这里有两件事:
首先:尝试读取字符串中的整个响应,然后使用ReadToEnd()处理该字符串:
第二件事:尝试设置request.CachePolicy,以便始终确保从服务器获取最新内容
我同意上面关于在对内容进行任何操作之前检查状态代码的评论
希望这有助于在尝试获取响应流之前尝试读取myResponse.StatusCode。每次迭代的状态代码都正常,并且我还设置了缓存策略,但经过更多的实验后,我发现如果在短时间内有太多来自同一台计算机或IP的请求,我正在查询的站点就会阻塞。从好的方面来说,我知道了状态码和缓存策略是什么。
//create StreamReader that reads characters one at a time
using (StreamReader myReader = new StreamReader(myStream))
{
string content = myReader.ReadToEnd();
// Process content
}