【问题标题】:Webresponse/Webrequest not workingWebresponse/Webrequest 不工作
【发布时间】:2012-02-11 08:14:53
【问题描述】:

我的程序使用WebRequestWebResponse 在迭代中从给定的URL 下载HTML 文件。例如,URL 字符串看起来像

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

其中varB 是循环中每次迭代的不同字符串。

将文件下载到流中后,它会在流中搜索特定的文本字符串并将它们存储到单独的文本文件中。但是,我发现在某些迭代中它似乎没有读取任何内容(当我在地址栏中键入它时,它的 URL 字符串是有效的,因此它不是无效的 URL)。

我将流和WebResponse 对象放在using 块中,我也有一个try…catch 块,但没有出现异常。在循环中使用WebRequestWebResponse 有问题吗?

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

【问题讨论】:

  • 在尝试获取响应流之前尝试阅读 myResponse.StatusCode。

标签: c# webrequest webresponse


【解决方案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 以便始终确保从服务器获取最新内容。

我同意上述关于在您对内容进行任何操作之前检查状态代码的评论。

希望有帮助

【讨论】:

  • 每次迭代的状态码都可以,我还设置了 CachePolicy,但经过更多试验后,我发现如果来自同一台计算机的请求过多,我正在查询的站点会阻塞或短时间内的IP。从好的方面来说,我了解了 StatusCode 和 CachePolicy 是什么。
【解决方案2】:

我会使用 Fiddler 之类的工具来了解实际发生的情况 - 您期望的数据是否从服务器返回。 顺便说一句,您为什么要两次调用 ReadLine() - 在某些情况下第一次调用不能吞下您的数据?

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 2010-09-10
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多