从Azure Pipeline部署到IIS服务器时遇ERROR_FILE_IN_USE错误求助
问题背景
部署时收到错误:
错误代码:ERROR_FILE_IN_USE
详细信息:Web Deploy无法修改目标服务器上的'file.dll'文件,因为它被外部进程锁定。要使发布操作成功,您可能需要重启应用以释放锁定,或为.Net应用使用AppOffline规则处理程序。
已尝试启用"Take App Offline"、停止/启动应用、复制文件、删除web.config、增加重试次数、添加csproj配置等方案,但问题仍存在。
额外解决方案尝试
1. 强制回收应用池并等待释放
在部署任务前添加PowerShell脚本,远程回收目标应用池并等待足够时间确保文件锁释放:
# 替换为实际的应用池名称和服务器地址 $appPoolName = "YourTargetAppPool" $serverName = "IISServerHostname" Invoke-Command -ComputerName $serverName -ScriptBlock { Import-Module WebAdministration # 回收应用池 Restart-WebAppPool -Name $using:appPoolName # 等待10秒确保进程完全退出 Start-Sleep -Seconds 10 }
确保Pipeline执行账号拥有目标服务器的远程执行权限和IIS管理权限。
2. 自定义Web Deploy发布配置
在项目的发布配置文件(如Properties/PublishProfiles/YourProfile.pubxml)中添加更严格的离线配置,同时手动创建app_offline.htm文件:
<PropertyGroup> <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline> <MSDeployUseChecksum>true</MSDeployUseChecksum> <DeployIisAppPath>YourSite/YourApplication</DeployIisAppPath> <EnableMSDeployBackup>false</EnableMSDeployBackup> </PropertyGroup>
在项目根目录创建app_offline.htm(内容示例:<h1>维护中,稍后恢复</h1>),确保Web Deploy会在部署前上传该文件并触发应用离线。
3. 定位锁定文件的进程
部署失败后立即在目标服务器执行命令,找出锁定file.dll的进程:
# 使用cmd查找 tasklist /m file.dll
# 使用PowerShell查找 Get-Process | Where-Object {$_.Modules.FileName -match "file.dll"} | Select-Object Id, ProcessName, Path
如果锁定进程是w3wp.exe之外的程序(如调试工具、后台服务),需先停止该进程再部署;如果是w3wp.exe,检查应用池回收是否生效,可延长回收后的等待时间。
4. 配置MSDeploy额外参数
在Azure Pipeline的IIS Web App Deploy任务中,找到Additional Arguments字段,添加以下参数增强解锁能力:
-enableRule:AppOffline -enableRule:SkipLockedFiles -retryAttempts:5 -retryInterval:2000
-enableRule:SkipLockedFiles:跳过暂时无法替换的锁定文件,后续重试-retryAttempts/-retryInterval:设置重试次数(5次)和间隔(2秒)
5. 临时禁用应用预加载
如果目标网站启用了预加载,可能导致应用提前启动锁定文件,可在部署前后通过脚本切换:
# 部署前禁用预加载 Set-ItemProperty "IIS:\Sites\YourSiteName" -Name preloadEnabled -Value $false # 执行部署任务... # 部署后重新启用预加载 Set-ItemProperty "IIS:\Sites\YourSiteName" -Name preloadEnabled -Value $true
6. 排查第三方锁定源
检查服务器上的杀毒软件、文件监控工具、备份服务等,是否实时扫描或备份应用目录。临时关闭这些工具的相关功能,测试部署是否正常,确认后添加应用目录到排除列表。
内容的提问来源于stack exchange,提问作者Tahami Rizwan

