Powershell Invoke-WebRequest con Method Head asigna demasiada RAM

Powershell Invoke-WebRequest con Method Head asigna demasiada RAM

Problema encontrado en el servidor con Powershell v 4.0 (servidores con Powershell 5.1 no parecen afectados por el mismo problema)

Este es un comportamiento extraño deInvocar-WebRequestdominio.

Tome este ejemplo:

Por alguna razón, necesito saber el tamaño del archivo antes de descargarlo en mi servidor.

Luego uso los siguientes comandos:

$WebClient = Invoke-WebRequest -Uri $element -Method Head -Credential $Cred
$filesize = $webClient.Headers.'Content-Length'

El problema esantes de enviar$WebClient solicita el uso de Powershell (para confirmar RAM) alrededor de 120 MB, perodespués de la solicitudpowershell aumenta su RAM con el valor del archivo $filesize (el archivo remoto de ejemplo es 800 MB, la nueva RAM de confirmación es 920 MB).

Cuando trabaja con una sesión de Powershell WinRM limitada a 1 GB de RAM, esto puede ser un problema. (OOM)

Respuesta1

Puede utilizar Invoke-WebRequestel HEADmétodo para obtener solo los encabezados y no descargar nada. Si el recurso que estás solicitando tiene una longitud conocida, obtendrás un Content-Lengthencabezado que puedes usar:

(Invoke-WebRequest $url -Method Head).Headers.'Content-Length'

Solo tenga en cuenta que no todos los servidores devuelven el Content-Lengthencabezado de todas las solicitudes. En ese caso, necesitará utilizar el método anterior, que lee el archivo completo, aunque es más lento y desperdicia memoria.

También puede interactuar directamente con las DLL de Windows que realizan solicitudes de Internet, ya sea Winnet (no disponible en Windows Server), o usando Servicios HTTP de Windows.

información relacionada