Powershell Invoke-WebRequest z Method Head przydziela zbyt dużo pamięci RAM

0

Problem znaleziony na serwerze z Powershell v 4.0 (serwer z Powershell 5.1 nie wydaje się być dotknięty tym samym problemem)

To dziwne zachowanie Invoke-WebRequest dowództwo.

Weź ten przykład:

Z jakiegoś powodu muszę znać rozmiar pliku przed pobraniem go na mój serwer.

Następnie używam następujących poleceń:

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

Problemem jest przed wysłaniem $ WebClient request Powershell use (dla Commit RAM) około 120 MB, ale po prośbie powershell powiększa pamięć RAM plik $ wartość rozmiaru pliku (przykładowy plik zdalny to 800 MB, nowa pamięć Commit RAM to 920 MB).

Podczas pracy z sesją WinSM w trybie Powershell ograniczoną do 1 GB pamięci RAM może to stanowić problem. (OOM)

Max Monterumisi
źródło

Odpowiedzi:

0

Możesz użyć Invoke-WebRequest z HEAD metoda, aby uzyskać tylko nagłówki i niczego nie pobierać. Jeśli zasób, którego żądasz, ma znaną długość, otrzymasz Content-Length nagłówek, którego możesz użyć:

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

Zwróć uwagę, że nie wszystkie serwery zwracają Content-Length nagłówek dla wszystkie prośby. W takim przypadku musisz użyć powyższej metody który odczytuje cały plik, chociaż jest wolniejszy i marnuje pamięć.

Możesz również bezpośrednio połączyć się z bibliotekami DLL systemu Windows, które wykonują żądania internetowe, zarówno WinINet (niedostępne w systemie Windows Server) lub za pomocą Usługi Windows HTTP .

harrymc
źródło
Jeśli wysyłasz i wysyłasz żądanie HEAD, a system zdalny zna Długość zawartości żądania zasobów, Powershell (i wszystkie inne języki) nie otrzymują pliku, ale tylko HEAD z zawartością Content-Lenght. Myślę, że nie ma sensu przydzielać tak dużo pamięci, jak duży jest plik, jeśli wykonam tylko żądanie głowy.
Max Monterumisi
Właściwie masz rację i jest sposób na wykorzystanie Invoke-WebRequest. Przepisałem moją odpowiedź.
harrymc