2015-04-28 7 views
0

Я делаю повторные запросы на веб-сервер с использованием HttpWebRequest, но я случайно получаю «поврежденный» поток ответов в ответ. например, он не содержит тегов, которые, как я предполагаю, должны быть там. Если я запрашиваю одну и ту же страницу несколько раз подряд, она становится «сломанной» ~ 3/5.HttpWebResponse возвращает «неполный» поток

Запрос всегда возвращает ответ 200, поэтому я сначала подумал, что в ответе было добавлено нулевое значение, которое заставило StreamReader считать, что оно дошло до конца.

I've пробовал: 1) читать все в массив байтов и очистки его 2) введение случайного Thread.Sleep после каждого запроса

есть ли потенциально плохая практика с моим кодом ниже или может кто-нибудь скажите мне, почему я случайно получаю неполный ответ? Насколько я вижу, я закрываю все неуправляемые ресурсы, чтобы это не было проблемой, не так ли?

public string ReturnHtmlResponse(string url) 
     { 
     string result; 
     var request = (HttpWebRequest)WebRequest.Create(url); 
      { 
      using(var response = (HttpWebResponse)request.GetResponse()) 
       { 
        Console.WriteLine((int)response.StatusCode); 
        var encoding = Encoding.GetEncoding(response.CharacterSet); 

        using(var stream = response.GetResponseStream()) 
         { 
         using(var sr = new StreamReader(stream,encoding)) 
          { 
          result = sr.ReadToEnd(); 
          } 
         } 
       } 
      } 
      return result; 
     } 
+0

Вы пытаетесь использовать метод «DownloadString» WebClient? – Pak

+0

Попробуйте кодированное кодирование для тестирования. Encoding.GetEncoding («ISO-8859-1») для примера. Я не вижу здесь никаких недостатков, должен работать. Имейте в виду, что ошибки могут быть серверной стороной –

+0

@Pak Yup, попробовал WebClient DownloadString и HtmlAgilityPack HtmlWeb.Load. Тот же результат:/ – 10199045

ответ

0

Я не вижу никаких прямых недостатков в вашем коде. Может быть, что один из операторов, использующих «родитель», выполняется до вложенного. Попробуйте изменить использование метода Dispose() и Close().

public string ReturnHtmlResponse(string url) 
     { 
     string result; 
     var request = (HttpWebRequest)WebRequest.Create(url); 

     var response = (HttpWebResponse)request.GetResponse(); 
     Console.WriteLine((int)response.StatusCode); 
     var encoding = Encoding.GetEncoding(response.CharacterSet); 
     var stream = response.GetResponseStream(); 
     var sr = new StreamReader(stream,encoding); 
     result = sr.ReadToEnd(); 

     sr.Close(); 
     stream.Close(); 
     response.Close(); 

     sr.Dispose(); 
     stream.Dispose(); 
     response.Dispose(); 

     return result; 
     } 
+0

Спасибо, я пробовал это, но, к сожалению, проблема остается. Я собираюсь предположить, что на данный момент это ошибка на стороне сервера и грубая сила, пока потоки не выполнит мои условия. Хелла уродливая, но что делать: / – 10199045

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