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

DevOps中实现IIS物理目录自动切换以避免API部署停机的问询

零停机部署.NET Core Web API:双目录+IIS自动切换的DevOps实现

当然可以完全通过编程/自动化脚本实现,根本不用手动修改IIS物理路径!这种方案本质上是轻量版的蓝绿部署,非常适配你的场景,下面一步步给你讲怎么在DevOps管道里落地:

核心思路

准备两个完全独立的部署目录(比如Api_blue和Api_green),IIS站点始终指向其中一个作为"活跃"目录。每次部署时:

  1. 将新代码发布到非活跃的备用目录
  2. 通过脚本修改IIS站点的物理路径,切换到新部署的目录
  3. IIS会自动启动新目录下的API进程,旧进程会被优雅回收,全程无停机

具体实现步骤

1. 提前配置IIS和目录结构

  • 在服务器上创建两个目录,比如C:\inetpub\wwwroot\Api_blue和C:\inetpub\wwwroot\Api_green
  • 新建IIS站点,初始指向其中一个目录(比如Api_blue),配置好对应应用池(确保是.NET Core托管模式)

2. 在DevOps管道中添加自动化切换脚本

不管你用Azure DevOps、GitHub Actions还是其他DevOps工具,都可以通过PowerShell脚本来修改IIS配置。下面是一个可直接复用的脚本示例:

# 配置参数,根据你的实际情况修改
$siteName = "YourApiSiteName"
$bluePath = "C:\inetpub\wwwroot\Api_blue"
$greenPath = "C:\inetpub\wwwroot\Api_green"

# 获取当前站点的物理路径
$currentActivePath = (Get-WebSite -Name $siteName).physicalPath

# 确定本次要部署的目标目录(备用目录)
$targetDeployPath = if ($currentActivePath -eq $bluePath) { $greenPath } else { $bluePath }

# --- 这里插入你的部署步骤 ---
# 比如用FTP/Web Deploy将新代码发布到$targetDeployPath
# 确保部署完成后,目标目录的文件是完整可用的

# 切换IIS站点到新部署的目录
Set-WebSite -Name $siteName -PhysicalPath $targetDeployPath

# 可选:如果需要强制刷新应用池(一般切换路径后IIS会自动触发重启,这步可省略)
# Restart-WebAppPool -Name (Get-WebSite -Name $siteName).applicationPool

3. 集成到DevOps发布管道

  • Azure DevOps:添加一个"PowerShell"任务,选择"内联脚本",把上面的代码粘贴进去,确保代理服务器有管理员权限修改IIS
  • GitHub Actions:使用windows-latest runner,添加run步骤执行PowerShell脚本,同样要确保runner有足够权限

关键注意事项

  • 权限:DevOps代理/runner必须有修改IIS配置的权限(比如以本地系统账户运行,或者添加管理员权限)
  • 一致性:两个目录的结构要完全一致,避免代码中有硬编码的路径依赖
  • 回滚:如果新部署出问题,只需要再运行一次脚本,切换回原来的目录即可,非常方便
  • 日志:可以在脚本中添加日志输出(比如Write-Host "Switched to target path: $targetDeployPath"),方便排查部署问题

这种方案比手动修改高效太多,而且能保证每次部署的一致性,完全符合DevOps自动化的理念。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:02:52