Powershell Invoke-WebRequest с методом 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 ГБ ОЗУ, это может быть проблемой. (ООМ)
1 ответ
Ты можешь использовать Invoke-WebRequest
с HEAD
способ получить только заголовки и ничего не скачивать. Если запрашиваемый ресурс имеет известную длину, вы получите Content-Length
заголовок, который вы можете использовать:
(Invoke-WebRequest $url -Method Head).Headers.'Content-Length'
Просто отметьте, что не все серверы возвращают Content-Length
заголовок для всех запросов. В этом случае вам нужно будет использовать вышеописанный метод, который читает весь файл, хотя он медленнее и тратит память.
Вы также можете напрямую взаимодействовать с DLL-библиотеками Windows, которые выполняют интернет-запросы, либо WinINet(недоступно на Windows Server), либо с помощью Windows HTTP Services.