【问题标题】:Invoke-RestMethod hangs on long running endpointsInvoke-RestMethod 挂在长时间运行的端点上
【发布时间】:2021-05-18 17:10:56
【问题描述】:

我们在 PowerShell 脚本中使用 Invoke-RestMethod 来调用具有可变长度运行时的 GET 方法端点。有些电话可能会在几秒钟后返回,有些可能需要长达 20 分钟。我们已通过 -TimeoutSec 参数设置了 50 分钟的通话超时时间。

只需几秒钟的调用就可以正常返回并输出预期的响应。更长的调用(例如 5 分钟)永远不会返回,并且 Invoke-RestMethod 命令会用完整个 50 分钟超时,尽管我们在 Web 服务器日志中确认服务器早已返回 200 OK

try 
{
    $Url = "https://example.com/task"   # GET
    $Timeout = 3000                     # 50 minute timout
    $Response = Invoke-RestMethod $Url -TimeoutSec $Timeout
        
    Write-Host $Response
}
catch 
{
    Write-Host $_.Exception
}

端点上没有身份验证。 PowerShell 版本为 7。脚本在托管被调用 Web 服务器的同一台机器上运行。

这是我们不知道的Invoke-RestMethod 的配置问题吗?我们在使用基本相同的脚本时遇到了与 Invoke-WebRequest 类似的问题。

【问题讨论】:

  • 这可能与较低层有关(与 PowerShell 无关)。例如,防火墙使用状态检查来打开连接端口,以便答案可以通过。端口不会永远开放。它们将在连接关闭后立即关闭,或者在超时后可能就是这种情况。 Invoke-WebRequest 肯定不能修改这样的超时。并且可能会有更多具有类似超时机制的服务。

标签: powershell invoke-webrequest invoke-restmethod


【解决方案1】:

我们能够通过将-DisableKeepAlive 开关添加到Invoke-RestMethod 命令来解决此问题。似乎 HTTP 保持活动功能阻止了 PowerShell 结束那些长时间运行的调用。

【讨论】:

    猜你喜欢
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多