2012-02-11 67 views
0

我的程序使用WebRequestWebResponse以便在迭代中從給定URL下載HTML文件。例如,URL字符串看起來像Web響應/ Webrequest不工作​​

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

+0

試圖在獲取響應流之前嘗試閱讀myResponse.StatusCode。 – 2012-02-11 09:14:51

回答

0

我會用Fiddler這樣的東西來知道實際發生了什麼 - 您希望的數據是否從服務器返回。 順便說一句,你爲什麼要調用ReadLine()兩次 - 在某些情況下第一次調用不能吞下你的數據?這裏

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如此你總是確信你從服務器獲得最新的內容。

我同意以上有關檢查狀態碼的意見,然後再對內容進行任何操作。

希望可以幫助

+0

狀態碼對於每次迭代都是正確的,我也設置了CachePolicy,但經過一些更多的試驗後,我發現如果在短時間內同一臺計算機或IP上有太多請求,我正在對該塊進行查詢。從好的一面,我瞭解了StatusCode和CachePolicy的含義。 – ShadowCrossZero 2012-02-11 19:15:58