2008-11-25 36 views
0

以下是我的控制台程序的用途:创建Web请求>保存Web请求的结果>使用QueryString从Web请求中获取下一个页面>保存这些结果>使用QueryString获取下一个从网络请求等页面C# - WebRequest不返回不同的页面

所以这里是我如何设置代码的一些伪代码。

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 IS正确递增,我可以剪切/粘贴网址strURL创建到一个Web浏览器,它的工作原理很好。

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

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

+0

你斩断了最好的部分 – 2008-11-25 20:42:24

+0

哈哈,它只是打开一个streamreader并将其保存到txt文档。 – MattSayar 2008-11-25 21:04:55

+0

你能解决这个问题吗? [email protected] – vbNewbie 2010-07-17 14:37:10

回答

4

您是否尝试过在循环过程中每次都创建新的WebRequest对象,它可能是Create()方法没有充分清除所有旧数据。

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

0

除非您使用MVC或可以正确解释查询字符串的东西,否则该URL对我来说并不合适。

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

应该是:

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

一些浏览器会接受成形差网址,使它们的罚款。其他人可能不会这可能是您的控制台应用程序的问题。

+0

我伪造了它的伪代码。在我的程序中是正确的。还有什么可能是这个问题? – MattSayar 2008-11-25 21:02:31

+0

服务器从控制台程序看到的用户代理是什么?也许服务器正在处理来自任何不同于来自特定浏览器的请求的请求。还有一个问题,该程序如何解决Web请求的DNS可能是什么东西.... – 2008-11-26 16:34:49

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

这里是我的可怕,黑客解决方案:

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