2015-07-20 4 views
0
.

. Я пишу простое приложение для запроса определенного URL-адреса в течение определенного периода времени для обнаружения изменений, но я замечаю, что после 5000 запросов или около того запросы начнут тайм-аут..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.Close или HttpWebResponse.Close способ закрыть поток и освободить соединение для повторного использования. Нет необходимости звонить как Stream.Close, так и HttpWebResponse.Close, но при этом не возникает ошибка. Невозможность закрыть поток приведет к тому, что ваше приложение закончит работу.

+0

Спасибо, что поймали это! –

Смежные вопросы