You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PowerShell在IIS响应缓慢时回收应用池?脚本报错求助

解决PowerShell应用池重启报错及脚本优化

首先说下你遇到的报错原因:你在Catch块里先执行了Stop-WebAppPool,紧接着又调用Restart-WebAppPool——但Restart-WebAppPool本身就包含了停止再启动的逻辑,当应用池已经被停止后,再调用重启命令就会触发这个"必须先启动已停止的对象才能重启"的错误,完全没必要多做一步Stop操作。

另外你的脚本还没实现10秒超时的需求,原来的[System.Net.WebRequest]默认超时可不是10秒,得手动设置。还有要注意如果请求超时进入Catch,$HTTP_Response会是null,直接调用Close()会报错,得加个判断。

下面是修改后的完整脚本,我标注了关键修改点:

# 加载IIS模块
Import-Module WebAdministration

while ($true) {
    Write-Host 'Running For Check app.xxx.com ...'
    # 首先创建请求
    $HTTP_Request = [System.Net.WebRequest]::Create('https://app.xxx.com/')
    # 新增:设置10秒超时(单位是毫秒)
    $HTTP_Request.Timeout = 10000
    # 初始化响应对象为null,避免后续报错
    $HTTP_Response = $null

    Try {
        # 获取站点响应
        $HTTP_Response = $HTTP_Request.GetResponse()
        # 获取HTTP状态码整数
        $HTTP_Status = [int]$HTTP_Response.StatusCode
        If ($HTTP_Status -eq 200) {
            Write-Host "Site is OK!"
        } Else {
            Write-Host "The Site returned non-200 status code, restarting app pool..."
            Restart-WebAppPool -Name "app.xxx.com"
        }
    } Catch {
        Write-Host "Request timed out or failed, restarting app pool..."
        # 移除多余的Stop-WebAppPool,直接调用重启即可
        Restart-WebAppPool -Name "app.xxx.com"
    }
    # 新增:判断响应对象不为null时再关闭连接
    if ($HTTP_Response) {
        $HTTP_Response.Close()
    }
    Start-Sleep -Seconds 120
}

关键修改说明:

  • 移除了Catch块里的Stop-WebAppPool,用Restart-WebAppPool单独处理即可,它会自动处理应用池的停止和重启流程
  • 添加了$HTTP_Request.Timeout = 10000,实现10秒超时的需求
  • 初始化$HTTP_Response = $null,并在关闭前判断对象是否存在,避免请求失败时调用Close()报错
  • 优化了日志输出,让你能更清楚知道触发重启的原因

这样修改后,既解决了重启报错的问题,也完整实现了你最初的需求:10秒超时或非200状态码时自动重启应用池。

内容的提问来源于stack exchange,提问作者Penguen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:09:54