2015-07-20 16 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

感谢您的支持! –