与Powershell并行发出请求会导致;不能对空值表达式调用方法";
我正在尝试使用powershell并行生成webrequests。我有一个函数“MakeRequest”,它生成我需要发出的请求类型。当一次性运行或按顺序运行时,此功能工作正常。然而,当我尝试使用启动作业或定义工作流来并行执行请求时,我遇到了错误“您不能对空值表达式调用方法”。当我尝试从web请求“$response=$webRequest.GetResponse()获取响应时,会引发此错误 我做错了什么/错过了什么与Powershell并行发出请求会导致;不能对空值表达式调用方法";,powershell,powershell-4.0,Powershell,Powershell 4.0,我正在尝试使用powershell并行生成webrequests。我有一个函数“MakeRequest”,它生成我需要发出的请求类型。当一次性运行或按顺序运行时,此功能工作正常。然而,当我尝试使用启动作业或定义工作流来并行执行请求时,我遇到了错误“您不能对空值表达式调用方法”。当我尝试从web请求“$response=$webRequest.GetResponse()获取响应时,会引发此错误 我做错了什么/错过了什么 [System.Net.ServicePointManager]::Serve
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
$MakeRequest = {
param($machineName, [int]$port)
Write-Host $machineName $port
$url = "https://$machineName" + ":$port/path"
$webRequest = [net.WebRequest]::Create($url)
$webRequest.Headers.Add('MyHeader', 'MyValue')
# 10 Minute Timeout
$webRequest.Timeout = 600000
$returnCode = 1
$output = ""
Try {
Write-Host $webRequest
$response = $webRequest.GetResponse()
$statusCode = [int]$response.StatusCode
if ($statusCode -ne 200) {
Write-Host "Server $machineName did not return a 200, and instead returned a $statusCode"
Exit 1
}
[IO.Stream] $stream = $response.GetResponseStream()
[IO.StreamReader] $reader = New-Object IO.StreamReader($stream)
[string] $output = $reader.readToEnd()
$stream.flush()
$stream.close()
$returnCode = 0
} Catch [system.exception] {
[IO.Stream] $stream = $_.Exception.Response.GetResponseStream()
[IO.StreamReader] $reader = New-Object IO.StreamReader($stream)
[string] $output = $reader.readToEnd()
$stream.flush()
$stream.close()
} Finally {
Write-Debug "$machineName $output"
}
}
@("mach1, mach2, mach3" ) | ForEach-Object { Start-Job -ScriptBlock $MakeRequest -ArgumentList $_, 10443 }
Get-Job | Wait-Job
Get-Job | % { Receive-Job $_.Id; Remove-Job $_.Id }
假设您发布的代码与您正在使用的代码相同,我相信问题在于您将参数传递给scriptblock的方式。我假设您希望foreach对象执行3次(一次用于mach1,一次用于mach2,一次用于mach3)是否正确 如果这个假设是正确的,那么问题是您只是将字符串“mach1,mach2,mach3”管道传输到foreach,而不是一个由3个字符串组成的数组。循环执行一次,并将“mach1,mach2,mach3”作为第一个参数传递 我制作了一个与您的脚本类似的脚本来测试它,如果字符串按如下方式进行管道传输,它就会工作: @(“mach1”、“mach2”、“mach3”)| Foreach对象{这里是您的起始工作代码}
请注意,每个项目现在都包含在自己的引号中。您是否研究过使用
调用WebRequest
方法?我尝试过,但也得到了一个错误-“基础连接已关闭:发送时发生意外错误。+CategoryInfo:invalidooperation:(System.Net.HttpWebRequest:HttpWebRequest)[Invoke WebRequest]、WebException+FullyQualifiedErrorId:WebCmdletWebResponseException、Microsoft.PowerShell.Commands.InvokeWebRequestCommand+PSComputerName:localhost“尝试放置[System.Net.ServicePointManager]::ServerCertificateValidationCallback={$true}”
在$MakeRequest
脚本块中。@PetSerAl-不走运。我不知道为什么这被否决了,他是绝对正确的。