2008-11-25 35 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末尾傳遞參數。它有效,但我覺得很骯髒。