Powershell Invoke-WebRequest com Method Head aloca muita RAM

Powershell Invoke-WebRequest com Method Head aloca muita RAM

Problema encontrado no servidor com Powershell v 4.0 (servidor com Powershell 5.1 eles não parecem afetados pelo mesmo problema)

Este é um comportamento estranho deInvocar-WebRequestcomando.

Veja este exemplo:

Por algum motivo, preciso saber o tamanho do arquivo antes de baixá-lo no meu servidor.

Então eu uso os seguintes comandos:

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

O problema éantes de enviar$WebClient solicita uso do Powershell (para Commit RAM) cerca de 120 MB, masdepois do pedidoO PowerShell aumenta sua RAM para o valor $filesize do arquivo (o arquivo remoto de exemplo tem 800 MB, a nova RAM de commit tem 920 MB).

Quando você trabalha com uma sessão Powershell WinRM limitada a 1 GB de RAM, isso pode ser um problema. (OOM)

Responder1

Você pode usar Invoke-WebRequesto HEADmétodo para obter apenas os cabeçalhos e não baixar nada. Se o recurso que você está solicitando tiver um comprimento conhecido, você receberá um Content-Lengthcabeçalho que poderá usar:

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

Observe que nem todos os servidores retornam o Content-Lengthcabeçalho para todas as solicitações. Nesse caso, você precisará usar o método acima, que lê o arquivo inteiro, embora seja mais lento e desperdice memória.

Você também pode interagir diretamente com as DLLs do Windows que fazem solicitações da Internet, seja WinINet (não disponível no Windows Server) ou usando Serviços HTTP do Windows.

informação relacionada