WinHTTPRequest.ResponseText не возвращает полный HTML?

Я пытался использовать запрос WinHTTP для получения веб-страницы (веб-сайта HTTPS) в VB.Net, и по какой-то причине он возвращал только частичный HTML, есть ли какие-либо ограничения по длине на количество символов, которые он может принять? Если да, то могу ли я получить контент после, скажем, 10000-го символа?

Соответствующий код находится здесь:

         oRequest = New WinHttp.WinHttpRequest            
            oRequest.Open("GET", sQueryURL, False)            
            oRequest.SetTimeouts(0, 600000, 0, 0)
            oRequest.Send()
            If oRequest.Status = "200" Then                
                Debug.Print(oRequest.ResponseText)
            Else

            End If


person AZhu    schedule 16.06.2011    source источник


Ответы (1)


Прошло некоторое время с тех пор, как я использовал WinHttpRequest, но я считаю, что как только вы прочитаете ResponseText, WinHttpRequest прекратит обработку ответа. Поскольку вы погружаетесь прямо в чтение ответа, я предполагаю, что полный ответ не будет получен к тому времени, когда вы напечатаете ResponseText!

Я думаю, у вас есть 2 варианта, чтобы попробовать:

  1. Используйте WinHttpRequest.WaitForResponse(), чтобы дождаться готовности всего ответа.
  2. Используйте WinHttpRequest.ResponseStream для обработки ответа по частям (вам нужно будет преобразовать части из байтов в читаемый текст)

Я не могу сказать, используете ли вы VB.Net, но если да: рассмотрите возможность использования System.Web.HttpRequest. Интерфейс почти такой же, и вам будет легче найти рабочие примеры и советы.

person Rocjoe    schedule 16.06.2011
comment
Пытался переписать с помощью класса HTTPRequest, все еще не повезло, он всегда останавливался на 249-й строке, около 2,4 тыс. символов.... - person AZhu; 16.06.2011
comment
Два приведенных выше параметра по-прежнему применяются к System.Web.HttpRequest. Ответы большего размера требуют времени для загрузки, поэтому важно, чтобы ваш код ждал полной обработки HttpRequest. Вместо этого попробуйте следующий пример: msdn.microsoft.com/en -us/library/ обратите внимание, что он использует StreamReader для обработки всего ответа. - person Rocjoe; 16.06.2011
comment
Моя первая догадка верна, ответ сервера неполный. В частности, заголовок содержит Transfer-Encoding: chunked. Единственный способ продолжить — добавить дополнительный код, который может выделить размер фрагмента и вернуться к серверу и запросить следующий фрагмент, пока все фрагменты не будут отправлены. Я не смог найти рабочий пример, чтобы указать вам. Предлагаю поискать альтернативы, может быть вот эту: http://code.google.com/p/c-sharp-http-client/, но я оставлю вам решать, работает ли он! - person Rocjoe; 17.06.2011
comment
@Rocjoe: То есть в существующей библиотеке / библиотеке по умолчанию нет способа получить размер фрагмента? И каким параметром заголовка является размер чанка? Большое спасибо за вашу помощь! - person AZhu; 17.06.2011
comment
@zhuanyi хорошо, что размер фрагмента кодируется сразу после заголовка HTTP. Попробуйте запустить свой пример URL-адреса через Fiddler, затем посмотрите на представление RAW для ответа, и вы увидите заголовок http, за которым следуют два возврата каретки, а затем число в базе 16. Это число и есть размер куска. - person Rocjoe; 17.06.2011
comment
@Rocjoe: Итак, я бы предположил, что размер этого фрагмента является постоянным (т. Е. Это часть их настройки сервера), так как я могу запросить следующий фрагмент после получения первого? точнее, как я могу напрямую запросить следующий фрагмент, пропустив первый? есть ли какой-нибудь код в winhttprequest или httpwebrequest, который делает что-то подобное? Большое спасибо за вашу помощь! - person AZhu; 17.06.2011
comment
@zhuanyi К сожалению, это та часть, где я тоже застрял. Лучший ответ, который я нашел, описывает логику, но не применяет ее в работающем коде: stackoverflow.com/questions/318489/ ... Итак, есть путь вперед, но вы можете сэкономить некоторые время/энергию, ища бесплатные альтернативные Http-библиотеки. - person Rocjoe; 17.06.2011