Неполный HttpWebResponse с большими наборами данных - PullRequest
3 голосов
/ 19 июля 2011

У меня есть некоторый код, который загружает содержимое веб-страницы, которую я использовал некоторое время.Этот код работает нормально, никогда не создавал проблем и до сих пор не ... Однако есть довольно большая страница (2 МБ, без изображений) с 4 таблицами по 4, 20, 100, 600 строк соответственно и около 20в ширину столбцов.

При попытке получить все данные он завершает без каких-либо явных ошибок или исключений, но возвращает только примерно до строки 60 в 4-й таблице - иногда больше, иногда меньше.Браузер завершает загрузку страницы примерно за 20-30 секунд с постоянной, что выглядит как сбрасывание, до полного завершения.

Я пробовал несколько решений от SO и осуществляет поиск без каких-либо других результатов.Ниже приведен текущий код, но у меня есть: прокси, асинхронный, без тайм-аутов, ложная поддержка активности ...

Я не могу использовать WebClient (как еще одну попытку удаленной выборки), потому что мне нужно войти в систему сcookiecontainer.

        HttpWebRequest pageImport = (HttpWebRequest)WebRequest.Create(importUri);
        pageImport.ReadWriteTimeout = Int32.MaxValue;
        pageImport.Timeout = Int32.MaxValue;
        pageImport.UserAgent = "User-Agent  Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3";
        pageImport.Accept = "Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        pageImport.KeepAlive = true;
        pageImport.Timeout = Int32.MaxValue;
        pageImport.ReadWriteTimeout = Int32.MaxValue;
        pageImport.MaximumResponseHeadersLength = Int32.MaxValue;

        if (null != LoginCookieContainer)
        {
            pageImport.CookieContainer = LoginCookieContainer;
        }

        Encoding encode = System.Text.Encoding.GetEncoding("utf-8");


        using (WebResponse response = pageImport.GetResponse())
        using (Stream stream = response.GetResponseStream())
        using (StreamReader reader = new StreamReader(stream, encode))
        {
            stream.Flush();
            HtmlRetrieved = reader.ReadToEnd();
        }

Ответы [ 3 ]

1 голос
/ 19 июля 2011

Попробуйте читать по блокам вместо читателя. ReadToEnd (); Просто чтобы дать вам представление:

// Передача потока в устройство чтения потока более высокого уровня с требуемым форматом кодирования StreamReader readStream = новый StreamReader (ReceiveStream, кодировать); Console.WriteLine ("поток получен \ nResponse"); Char [] read = new Char [256];

    // Read 256 charcters at a time.    
 int count = readStream.Read( read, 0, 256 );
    Console.WriteLine("HTML...\r\n");

while (count > 0) 
{
        // Dump the 256 characters on a string and display the string onto the console.
    String str = new String(read, 0, count);
    Console.Write(str);
    count = readStream.Read(read, 0, 256);
}
0 голосов
/ 19 июля 2011

Хотя я все еще собираюсь попробовать предоставленные предложения и изменит свой ответ, если он будет работать, похоже, что в этом случае проблема заключается в прокси. Я оказался перед прокси, и код работает, как ожидалось, и намного быстрее.

Мне нужно взглянуть на некоторые оптимизации прокси, так как этот код должен работать за прокси.

0 голосов
/ 19 июля 2011

Я подозреваю, что это обрабатывается как параметр конфигурации на стороне сервера. Кстати, я думаю, что вы, возможно, устанавливаете свои свойства неправильно. Удалите «user-agent» и «accept» из литералов следующим образом:

pageImport.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3";         
pageImport.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...