ASP.NET应用GitHub Actions FTP部署遇550文件占用问题求助
问题解答
错误信息
deployServer - FTPError: 550 The process cannot access the file because it is being used by another process.
持续部署YAML代码
name: Deploy server on: push: branches: - main jobs: deployServer: runs-on: windows-latest steps: - uses: actions/checkout@v2 - name: Setup .NET Core uses: actions/setup-dotnet@v1 with: dotnet-version: 8.0.x - name: Install dependencies run: dotnet restore - name: Configure Git run: | git config --global core.fsmonitor false - name: Build with dotnet run: dotnet build --configuration Release --no-restore working-directory: ./Biblia_Commentatione - name: Test run: dotnet test --no-restore --verbosity normal - name: Install EF Core tool run: dotnet tool install --global dotnet-ef - name: Restore tools run: dotnet tool restore - name: Migrate run: | cd Biblia_Commentatione dotnet tool restore dotnet ef database update --connection "${{ secrets.CONNECTION_STRING }}" cd .. - name: Setup .NET Core uses: actions/setup-dotnet@v1 with: dotnet-version: 8.0.x - name: Publish run: dotnet publish -c Release --output ./bin/Release/.net8.0 working-directory: ./Biblia_Commentatione - name: FTP Deploy uses: SamKirkland/FTP-Deploy-Action@v4.3.4 with: server: win5161.site4now.net username: ${{ secrets.MYASP_USERNAME }} password: ${{ secrets.MYASP_PASSWORD }} local-dir: ./Biblia_Commentatione/bin/Release/.net8.0/ server-dir: BibliaCommentatione/
问题现象
每次合并PR到main分支触发部署时,都会出现上述文件被占用的错误。手动重启应用池后重新运行工作流有时能成功,推测是应用处于活跃状态导致文件被进程锁定。
需求
实现自动化持续部署,避免因文件被占用而需要手动重试或重启应用池的情况。
针对疑问的解答
脚本是否存在问题?
有两处冗余操作可优化:- 重复执行了
Setup .NET Core步骤,只需在工作流开头执行一次即可; Migrate步骤中重复执行dotnet tool restore,前面已执行过该命令,无需再次运行。
但核心问题是缺少部署前回收/停止应用池的步骤,这才是导致文件被占用的直接原因。
- 重复执行了
文件持续被占用的根源是什么?是否有操作不当之处?
根源是ASP.NET应用运行时,IIS的工作进程(w3wp.exe)会锁定正在使用的程序集文件和配置文件。当FTP部署尝试覆盖这些文件时,就会触发“文件被占用”的错误。
操作上的不当之处在于:部署前未先释放被锁定的文件,直接执行FTP上传覆盖。能否在YAML脚本中触发应用池重启?
可以实现,常用方式有:- PowerShell远程执行:若服务器开启PowerShell远程管理,可添加步骤通过
Invoke-Command远程调用Restart-WebAppPool命令,需提前将服务器凭证存入Actions secrets; - 调用主机API:部分主机提供商提供应用池管理API,可在工作流中添加HTTP请求步骤调用API重启应用池;
- 使用IIS管理Action:通过自定义脚本或第三方Action,调用服务器IIS管理接口完成应用池回收。
- PowerShell远程执行:若服务器开启PowerShell远程管理,可添加步骤通过
如何让myasp.net不阻塞文件?
推荐几种解决方案:- 部署前回收应用池:在FTP部署步骤前添加回收操作,释放被锁定的文件;
- 使用部署槽:若主机支持,先将新版本部署到槽位,再切换流量,实现零停机部署且避免文件锁定;
- 启用影子复制:ASP.NET Core默认启用影子复制,会将程序集复制到临时目录运行,避免锁定原文件。若宿主环境禁用,可检查配置重新开启;
- 启停应用池部署:允许短暂停机的情况下,上传前停止应用池,完成后再启动。
这是否是myasp.net的已知问题?
这是Windows IIS托管ASP.NET应用的常见问题,并非myasp.net特有。所有IIS托管的.NET应用,都会存在运行时进程锁定文件的情况,部署前回收应用池是常规解决手段。
内容的提问来源于stack exchange,提问作者mathdxdx
相关产品推荐
相关产品推荐

