C# - WebRequest不返回不同的页面

时间:2008-11-25 20:40:06

标签: c# html

以下是我的控制台程序的目的:发出网络请求>保存网络请求的结果>使用QueryString从Web请求获取下一页>保存这些结果>使用QueryString从Web请求等获取下一页

所以这里有一些关于如何设置代码的伪代码。

 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正确递增,我可以将网址strURL创建的网址剪切/粘贴到网页浏览器中,效果很好。

我可以手动输入&page=1&page=2&page=3,然后它会返回正确的页面。不知怎的把增量放在那里搞砸了。

它与会话有什么关系,或者什么?我确保在它再次循环之前关闭流和阅读器......

5 个答案:

答案 0 :(得分:4)

您是否尝试过在循环期间每次创建一个新的WebRequest对象,可能是Create()方法没有充分刷新其所有旧数据。

要检查的另一件事是在下一次循环迭代之前,ResponseStream已被充分刷新。

答案 1 :(得分:2)

此代码适用于我:

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);
}

答案 2 :(得分:1)

只是一个建议,尝试处理Stream和Reader。我已经看到一些奇怪的情况,没有处理像这样的对象,并在循环中使用它们会产生一些古怪的结果....

答案 3 :(得分:0)

除非您正在使用MVC或能够正确解释查询字符串的内容,否则该URL对我来说没有多大意义。

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

应该是:

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

有些浏览器会接受格式不正确的网址并将其渲染得很好。其他可能不是您的控制台应用程序的问题。

答案 4 :(得分:-1)

这是我糟糕的黑客解决方案:

创建另一个调用此应用程序的控制台应用程序,其中第一个控制台应用程序在strURL结束时传递参数。它有效,但我觉得很脏。