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

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分支触发部署时,都会出现上述文件被占用的错误。手动重启应用池后重新运行工作流有时能成功,推测是应用处于活跃状态导致文件被进程锁定。

需求

实现自动化持续部署,避免因文件被占用而需要手动重试或重启应用池的情况。


针对疑问的解答

  1. 脚本是否存在问题?
    有两处冗余操作可优化:

    • 重复执行了Setup .NET Core步骤,只需在工作流开头执行一次即可;
    • Migrate步骤中重复执行dotnet tool restore,前面已执行过该命令,无需再次运行。
      但核心问题是缺少部署前回收/停止应用池的步骤,这才是导致文件被占用的直接原因。
  2. 文件持续被占用的根源是什么?是否有操作不当之处?
    根源是ASP.NET应用运行时,IIS的工作进程(w3wp.exe)会锁定正在使用的程序集文件和配置文件。当FTP部署尝试覆盖这些文件时,就会触发“文件被占用”的错误。
    操作上的不当之处在于:部署前未先释放被锁定的文件,直接执行FTP上传覆盖。

  3. 能否在YAML脚本中触发应用池重启?
    可以实现,常用方式有:

    • PowerShell远程执行:若服务器开启PowerShell远程管理,可添加步骤通过Invoke-Command远程调用Restart-WebAppPool命令,需提前将服务器凭证存入Actions secrets;
    • 调用主机API:部分主机提供商提供应用池管理API,可在工作流中添加HTTP请求步骤调用API重启应用池;
    • 使用IIS管理Action:通过自定义脚本或第三方Action,调用服务器IIS管理接口完成应用池回收。
  4. 如何让myasp.net不阻塞文件?
    推荐几种解决方案:

    • 部署前回收应用池:在FTP部署步骤前添加回收操作,释放被锁定的文件;
    • 使用部署槽:若主机支持,先将新版本部署到槽位,再切换流量,实现零停机部署且避免文件锁定;
    • 启用影子复制:ASP.NET Core默认启用影子复制,会将程序集复制到临时目录运行,避免锁定原文件。若宿主环境禁用,可检查配置重新开启;
    • 启停应用池部署:允许短暂停机的情况下,上传前停止应用池,完成后再启动。
  5. 这是否是myasp.net的已知问题?
    这是Windows IIS托管ASP.NET应用的常见问题,并非myasp.net特有。所有IIS托管的.NET应用,都会存在运行时进程锁定文件的情况,部署前回收应用池是常规解决手段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 09:11:22