2015-07-20 40 views
0

我正在編寫一個簡單的應用程序來查詢一段時間內的某個URL以檢測更改,但是我注意到在5,000次請求之後,請求將開始時間到。.NET - 在一段時間後請求超時

它確實循環通過主機(具有大約200個不同的主機來循環)

目標和源極連接都是極爲穩定的。

重新啓動程序後,超時沒有問題。

下面是相關代碼:

public static string download_data() 
{ 
    String ret = String.Empty; 
    try 
    { 
     Uri newUri = new Uri(FinalURL.Replace(Host,Hosts[bestHostIndex])); 
     var request = (HttpWebRequest)WebRequest.Create(newUri); 
     request.Method = "GET"; 
     request.AllowAutoRedirect = true; 
     request.KeepAlive = true; 
     request.Referer = EscapedURL; 
     request.UserAgent = UA; 
     request.Headers.Add("Pragma", "no-cache"); 
     request.Timeout = 3000; 
     request.Host = HostMain; 
     request.Proxy = null; 
     request.CookieContainer = Session.Cookies; 
     using (var resp = request.GetResponse()) 
     { 
      var reader = new StreamReader(resp.GetResponseStream()); 
      ret = reader.ReadToEnd(); 
     } 

      return ret; 
    } 
    catch(WebException e) 
    { 
     Console.WriteLine("Error: "+e.Message); 
     if (e.Status == WebExceptionStatus.ProtocolError) 
     { 
      WebResponse resp = e.Response; 
      using (StreamReader sr = new StreamReader(resp.GetResponseStream())) 
      { 
       ret = sr.ReadToEnd(); 
      } 
     } 
     return ret; 
    } 
} 

很奇怪,因爲我認爲那裏是有連接的問題,然後重新啓動應用程序將不會解決問題。看起來網絡在應用運行時間越長的時候就會「堵塞」。也許我沒有正確地衝洗資源或類似的東西。

此外,可能有必要提及第一個請求總是超時。

幫助將是巨大的

回答

3

你需要對夫婦更using聲明:

using (var resp = request.GetResponse()) 
using (var responseStream = resp.GetResponseStream()) 
using (var reader = new StreamReader(responseStream)) 
{ 
    ret = reader.ReadToEnd(); 
} 

如果不調用Close,處置GetResponseStream返回流的連接不會被釋放,這就是爲什麼你過了一段時間後,連接斷開。 MSDN對此也很清楚:

必須調用要麼Stream.CloseHttpWebResponse.Close方法關閉該流並釋放重複使用的連接。沒有必要撥打Stream.CloseHttpWebResponse.Close,但這樣做不會導致錯誤。 未能關閉流將導致您的應用程序用完連接。

+0

感謝您的支持! –