Powershell Invoke-WebRequest с Method Head выделяет слишком много оперативной памяти

Powershell Invoke-WebRequest с Method Head выделяет слишком много оперативной памяти

На сервере обнаружена проблема с Powershell v 4.0 (сервер с Powershell 5.1, похоже, не затронут той же проблемой)

Это странное поведениеInvoke-WebRequestкоманда.

Возьмем такой пример:

По какой-то причине мне нужно знать размер файла перед его загрузкой на свой сервер.

Затем я использую следующие команды:

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

Проблема вперед отправкойЗапрос $WebClient Powershell использует (для Commit RAM) около 120 МБ, нопосле запросаpowershell увеличьте размер оперативной памяти до значения $filesize файла (например, удаленный файл имеет размер 800 МБ, новый выделенный размер оперативной памяти составляет 920 МБ).

Это может стать проблемой при работе с сеансом Powershell WinRM, ограниченным 1 ГБ ОЗУ. (OOM)

решение1

Вы можете использовать метод Invoke-WebRequestwith HEAD, чтобы получить только заголовки и ничего не загружать. Если ресурс, который вы запрашиваете, имеет известную длину, то вы получите заголовок, Content-Lengthкоторый вы можете использовать:

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

Просто обратите внимание, что не все серверы возвращают Content-Lengthзаголовок для всех запросов. В этом случае вам нужно будет использовать ваш метод выше, который читает весь файл, хотя это медленнее и тратит память.

Вы также можете напрямую взаимодействовать с библиотеками DLL Windows, которые выполняют интернет-запросы, WinINet (недоступно на Windows Server) или с помощью HTTP-службы Windows.

Связанный контент