Powershell Invoke-WebRequest 的 Method Head 分配了过多的 RAM

Powershell Invoke-WebRequest 的 Method Head 分配了过多的 RAM

在装有 Powershell v 4.0 的服务器上发现问题 (使用 Powershell 5.1 的服务器似乎没有受到相同问题的影响)

这是一个奇怪的行为调用 Web 请求命令。

请看这个例子:

出于某种原因,我需要在将文件下载到我的服务器之前知道文件的大小。

然后我使用以下命令:

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

问题是发送前$WebClient 请求 Powershell 使用(用于提交 RAM)大约 120MB,但是请求后powershell 将您的 RAM 扩大到文件 $filesize 值(例如远程文件为 800MB,新的 Commit RAM 为 920MB)。

当您使用 Powershell WinRM 会话限制为 1GB RAM 时,这可能会成为一个问题。(OOM)

答案1

您可以使用Invoke-WebRequestHEAD方法仅获取标头而不下载任何内容。如果您请求的资源具有已知长度,那么您将获得一个Content-Length可以使用的标头:

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

请注意,并非所有服务器都会返回Content-Length所有请求的标头。在这种情况下,您将需要使用上述方法读取整个文件,尽管它速度较慢且浪费内存。

您还可以直接与执行 Internet 请求的 Windows DLL 交互, 温因特网 (在 Windows Server 上不可用),或者使用 Windows HTTP 服务

相关内容