Invoke-RestMethod:操作已超时

时间:2014-04-29 01:29:17

标签: http powershell

我有一个删除资源并创建新资源的脚本。它时不时地超时,我无法弄清楚原因。这似乎发生在我多次运行脚本时,但我无法获得明确的模式。我发现我的服务器还没有收到消息,因为还没有记录请求。

$old_values = Invoke-RestMethod -Uri $uri -Method Get

foreach($old_value in $old_values.result) {
    Invoke-RestMethod -Uri "$uri&key=$old_value.id" -Method Delete
}

$new_value = Invoke-RestMethod -Uri "$uri" -Body "{}" -ContentType application/json -Method Post

有趣的是,当我直接从powershell运行Invoke-RestMethod调用时,偶尔会出现超时。我也和Fiddler一起跑了他们,从来没有超时。

[编辑]我一直在检查与netstat的连接。当命令挂起时,它们被列为ESTABLISHED。但我一直看到TIME_WAIT连接列在我的服务器上。我的关系是否有可能被关闭?

3 个答案:

答案 0 :(得分:5)

David Brabant上面发布的链接包含了解决这个问题的解决方法:

$r = (Invoke-WebRequest -Uri $uri `
    -Method 'POST' `
    -ContentType 'application/json' `
    -Body '{}' `
    ).Content | ConvertFrom-Json

答案 1 :(得分:0)

我发现Allanrbo的答案是在3或4次运行后仍然超时。

我改为做了以下事情:

powershell "(Invoke-RestMethod -Method 'Delete' -Uri '$uri').Content"

答案 2 :(得分:0)

很抱歉提出旧话题。我们现在使用Win 7和PowerShell 3.0版 我们遇到了与POST方法相同的问题。当我们第3次POST相同的JSON时,powershell窗口将挂起。关闭后重新打开它会起作用。

为了解决这个问题,简单地在POST结束时添加2行:

$ServicePoint = [System.Net.ServicePointManager]::FindServicePoint('<URL>')
$ServicePoint.CloseConnectionGroup("")

参阅: https://social.technet.microsoft.com/wiki/contents/articles/29863.powershell-rest-api-invoke-restmethod-gotcha.aspx