Подтвердить что ты не робот

Powershell - Почему использование Invoke-WebRequest намного медленнее, чем загрузка браузера?

Я использую метод Powershell Invoke-WebRequest для загрузки файла из Amazon S3 в мой экземпляр Windows EC2.

Если я загружаю файл с помощью Chrome, я могу загрузить файл размером 200 МБ за 5 секунд. Та же загрузка в PowerShell с использованием Invoke-WebRequest занимает до 5 минут.

Почему использование Invoke-WebRequest медленнее и есть ли способ загрузки с полной скоростью в PowerShell script?

4b9b3361

Ответ 1

Я использовал

Invoke-WebRequest $video_url -OutFile $local_video_url

Я изменил сказанное выше на

$wc = New-Object net.webclient
$wc.Downloadfile($video_url, $local_video_url)

Это восстановило скорость загрузки до того, что я видел в своих браузерах.

Ответ 2

Не отключаясь от Invoke-WebRequest, отключив индикатор выполнения, я сделал это для меня. Я нашел ответ из этой темы: https://github.com/PowerShell/PowerShell/issues/2138 (jasongin прокомментировал 3 октября 2016 года)

$ProgressPreference = 'SilentlyContinue'
Invoke-WebRequest <params>

Для моего 5MB файла на localhost время загрузки увеличилось с 30 до 250 мс.

Обратите внимание, что чтобы вернуть индикатор выполнения в активную оболочку, вам необходимо вызвать $ProgressPreference = 'Continue'.

Ответ 3

Я просто ударил эту проблему сегодня, если вы измените аргумент ContentType на application/octet-stream, это намного быстрее (так же быстро, как и с помощью webclient). Причина в том, что команда Invoke-Request не будет пытаться анализировать ответ как JSON или XML.

Invoke-RestMethod -ContentType "application/octet-stream" -Uri $video_url  -OutFile $local_video_url

Ответ 4

Я бы предположил, что причина, по которой Invoke-WebRequest медленнее, заключается в том, что он выполняет синтаксический анализ стилей страницы, которую вы запрашиваете, тогда как веб-клиент .NET просто выдает запрос на получение и сохраняет ответ.

Invoke-WebRequest анализирует свойства Content, ParsedHtml, Forms, InputFields, Links, Images, Scripts, AllElements, BaseResponse и StatusCode.

Довольно хорошая статья об очистке с помощью Invoke-WebRequest.