web-dev-qa-db-fra.com

Powershell - Pourquoi l'utilisation d'Invoke-WebRequest est-elle beaucoup plus lente qu'un téléchargement par navigateur?

J'utilise la méthode Invoke-WebRequest De Powershell pour télécharger un fichier d'Amazon S3 vers mon instance Windows EC2.

Si je télécharge le fichier à l'aide de Chrome, je peux télécharger un fichier de 200 Mo en 5 secondes. Le même téléchargement dans PowerShell en utilisant Invoke-WebRequest Prend jusqu'à 5 minutes.

Pourquoi l'utilisation de Invoke-WebRequest Est-elle plus lente et existe-t-il un moyen de télécharger à pleine vitesse dans un script PowerShell?

36
Lloyd Banks

J'utilisais

Invoke-WebRequest $video_url -OutFile $local_video_url

J'ai changé ce qui précède en

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

Cela a restauré la vitesse de téléchargement à ce que je voyais dans mes navigateurs.

27
Lloyd Banks

Sans quitter Invoke-WebRequest, désactiver la barre de progression l'a fait pour moi. J'ai trouvé la réponse à partir de ce fil: https://github.com/PowerShell/PowerShell/issues/2138 (jasongin a commenté le 3 octobre 2016)

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

Pour mon fichier de 5 Mo sur localhost, le temps de téléchargement est passé de 30 à 250 ms.

Notez que pour récupérer la barre de progression dans le shell actif, vous devez appeler $ProgressPreference = 'Continue'.

50

Je viens de frapper ce problème aujourd'hui, si vous changez l'argument ContentType en application/octet-stream c'est beaucoup plus rapide (aussi rapide que l'utilisation de webclient). La raison en est que la commande Invoke-Request ne tentera pas d'analyser la réponse au format JSON ou XML.

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

Je suppose que le raisonnement derrière lequel Invoke-WebRequest est plus lent est son analyse de style de grattage de la page que vous demandez, tandis que le client Web .NET émet simplement une demande d'obtention et enregistre la réponse.

Invoke-WebRequest analyse les propriétés Content, ParsedHtml, Forms, InputFields, Links, Images, Scripts, AllElements, BaseResponse et StatusCode.

Assez bien article sur le grattage avec Invoke-WebRequest.

0
cchamberlain