2010-05-15 3 views
0

У меня есть приложение, которое создает много веб-запросов для загрузки страниц новостей на веб-сайте (я тестировал многие веб-сайты) через некоторое время выясняю, что приложение замедляется в извлечении html-источника, я обнаружил, что HttpWebResonse не получает ответ. Я отправляю только функцию, выполняющую эту работу.HttpWebResonse зависает по нескольким запросам

public PageFetchResult Fetch() 
    { 
     PageFetchResult fetchResult = new PageFetchResult(); 
     try 
     { 
      HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(URLAddress); 
      HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
      Uri requestedURI = new Uri(URLAddress); 
      Uri responseURI = resp.ResponseUri; 
      if (Uri.Equals(requestedURI, responseURI)) 
      { 
       string resultHTML = ""; 
       byte[] reqHTML = ResponseAsBytes(resp); 
       if (!string.IsNullOrEmpty(FetchingEncoding)) 
        resultHTML = Encoding.GetEncoding(FetchingEncoding).GetString(reqHTML); 
       else if (!string.IsNullOrEmpty(resp.CharacterSet)) 
        resultHTML = Encoding.GetEncoding(resp.CharacterSet).GetString(reqHTML); 

       resp.Close(); 
       fetchResult.IsOK = true; 
       fetchResult.ResultHTML = resultHTML; 
      } 
      else 
      { 
       URLAddress = responseURI.AbsoluteUri; 
       relayPageCount++; 
       if (relayPageCount > 5) 
       { 
        fetchResult.IsOK = false; 
        fetchResult.ErrorMessage = "Maximum page redirection occured."; 
        return fetchResult; 
       } 
       return Fetch(); 
      } 
     } 
     catch (Exception ex) 
     { 
      fetchResult.IsOK = false; 
      fetchResult.ErrorMessage = ex.Message; 
     } 
     return fetchResult; 
    } 

любое решение будет весьма признателен

ответ

0

Fetch функция вызывается рекурсивно и всегда создает HttpWebRequest, но выпускать только тогда, когда URL подобран. Вы должны закрыть запрос и ответ в инструкции else.

0

Я согласен с @volody, также у HttpWebRequest уже есть свойство MaximumAutomaticRedirections, которое установлено в 50, вы можете установить его на 5, чтобы автоматически достичь того, что вы ищете в этом коде, так или иначе, оно вызовет исключение, и это будет обрабатываться вашим кодом.

Просто установите

request.MaximumAutomaticRedirections = 5; 
+0

Спасибо за ваши комментарии (volody, Акаши кава), я сосредоточил свой код, но это не моя проблема (перенаправление не моя точка потому что это никогда не происходит, его просто профилактическим код) это приложение, получающее около 500 веб-страниц, а затем внезапно зависает, я точно не знаю, что из этого получилось. любое другое решение? – Ehsan

+0

Это может быть проблема с потоками, и как вы управляете потоками. Вы должны попробовать параллельные расширения .net 4.0, которые могут помочь, поскольку ваш код может иметь тупик, параллельное расширение которого может обеспечить такую ​​же логику с улучшенной потоковой обработкой. Кроме того, это может быть ваш брандмауэр, блокирующий его, думая, что это какая-то атака, а также каждый домен допускает одновременное одновременное подключение максимум 2 HTTP, поэтому я думаю, что вы должны группировать свои запросы по доменам и ставить их в очередь для одного домена, что может помочь , –

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