Powershell - Почему использование Invoke-WebRequest намного медленнее, чем загрузка браузера?
Я использую метод Powershell Invoke-WebRequest
для загрузки файла из Amazon S3 в мой экземпляр Windows EC2.
Если я загружаю файл с помощью Chrome, я могу загрузить файл размером 200 МБ за 5 секунд. Та же загрузка в PowerShell с использованием Invoke-WebRequest
занимает до 5 минут.
Почему использование Invoke-WebRequest
медленнее и есть ли способ загрузки с полной скоростью в PowerShell script?
Ответы
Ответ 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.