【问题标题】:Azure Web App deploy: Web Deploy cannot modify the file on the destination because it is locked by an external processAzure Web App 部署:Web 部署无法修改目标上的文件,因为它被外部进程锁定
【发布时间】:2021-03-10 20:59:35
【问题描述】:

我正在使用 VSTS 中的“Azure Web App Deployment”构建步骤将 ASP.NET Core API 发布到 Azure Web App:

有时,此步骤会因以下错误而中断:

[错误]Microsoft.Web.Deployment.DeploymentDetailedClientServerException: Web 部署无法修改文件“MyProject.Api.exe” 目的地,因为它被外部进程锁定。为了 允许发布操作成功,您可能需要重新启动 您的应用程序释放锁,或使用 AppOffline 规则 .Net 应用程序在您下一次发布尝试时的处理程序。学 更多在: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE.

This GitHub issue 提出了同样的问题,但没有使用 Azure Web 应用部署构建步骤的建议解决方案。

【问题讨论】:

    标签: azure azure-web-app-service azure-devops azure-pipelines-build-task azure-pipelines


    【解决方案1】:

    根据 Microsoft Github 存储库 here 中的单独线程,有一个 hacky 解决方法,如果您将以下密钥添加到 Azure Appsettings,它可以帮助解决锁定文件部署错误:

    MSDEPLOY_RENAME_LOCKED_FILES = 1
    

    我不确定这个 appsetting hack 会支持多长时间,但它确实帮助我个人解决了这个问题。

    【讨论】:

    • 一个观察结果是它解决了部署问题,但由于该项目已重命名,因此下次重新加载应用程序时将不会被拾取。所以被重命名的exe下次不会真正启动,而是仍然使用旧的exe。
    • @GeorgeOnofrei 是的,我认为您的里程会有所不同。我已经看到其他人描述了您正在谈论的问题,但就我个人而言,它似乎可以很好地接受新的 DLL。
    • 看到这个并去添加它。已经在那里了。不适合我
    【解决方案2】:

    我一直在努力解决同样的锁定问题。
    现在可以添加一个新任务(预览版),用于启动和停止应用服务:

    部署前添加停止任务,部署后添加启动任务。

    这对我有用。

    【讨论】:

    • 我认为从所有解决方案中这个是最好的
    • 同意,这是我们用来部署 .NET Core Web api 的那个
    【解决方案3】:

    您可以重启Function App来解除锁定。之后你应该可以部署了。

    【讨论】:

    • 这对于紧急情况来说是可以的,但对于日常部署来说并不实用。另外,如果您有活跃的客户端,则应该单击停止,否则它们只会在您仍在部署时触发问题。
    • 另外,函数现在支持插槽,可能还支持插槽交换,因此您可以部署到逻辑“节点 A”/“节点 B”并交换它们
    【解决方案4】:

    我在尝试发布 Azure Function App 时遇到了同样的错误。我按照thisMicrosoft 文档做了以下步骤。

    1. 右键单击您的项目并选择编辑 ....csproj
    2. 在 PropertyGroup 标签中添加<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>

      <PropertyGroup>
        <TargetFramework>netcoreapp2.1</TargetFramework>
        <AzureFunctionsVersion>v2</AzureFunctionsVersion>
        <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
      </PropertyGroup>
      
    3. 保存并重建您的解决方案

    4. 现在再次发布

    如果这对您不起作用,您可以随时将 MSDEPLOY_RENAME_LOCKED_FILES=1 添加到您的应用程序设置中,正如 Ben 先生在他的回答中提到的那样。您可以从 Visual Studio 本身执行此操作。

    希望对你有帮助

    【讨论】:

      【解决方案5】:

      您可以创建两个 Power Shell 脚本:

      stopapp.ps1:

      param($websiteName)
      $website = Get-AzureWebsite -Name $websiteName
      Stop-AzureWebsite -Name $websiteName
      

      startapp.ps1:

      param($websiteName)
      $website = Get-AzureWebsite -Name $websiteName
      Start-AzureWebsite -Name $websiteName
      

      然后在“Azure Web App Deployment”任务前后添加“Azure PowerShell”任务,以在部署前停止Web应用程序,在部署后启动应用程序。

      【讨论】:

      • 您的回答像往常一样有用,谢谢 Eddie。唯一缺少的是一种指定部署槽的方法,但更改脚本很容易。
      • 谢谢,这很有帮助!我有一个问题:您如何以及在哪里上传 Powershell 脚本?您是否将它们合并到您的解决方案中。我有一个 asp.net-app。
      • @sebvst 只需将其签入您的源代码管理。现在,您可以使用一个扩展来更轻松地执行此操作:marketplace.visualstudio.com/…
      • 谢谢!有两个非常相似的扩展。对我有用的是:marketplace.visualstudio.com/…(它也支持插槽)
      【解决方案6】:

      在发布时让网站离线应该可以解决问题。

      【讨论】:

      • 这行得通。出于显而易见的原因,我只会这样做,或者任何基于脚本的应用程序在暂存槽上重新启动..
      • 为什么我没有重命名锁定的文件?
      • @Simon_Weaver 截图是 15 个月前拍摄的。我相信他们也发布了新版本。因此他们可能已将此选项移至其他地方或完全弃用它。环顾四周或尝试更改版本。
      • 谢谢。他们肯定还在推荐它,因为它在错误消息中这么说!
      • 您的解决方案是唯一对我有用的解决方案,因为我的问题出在 IaaS (vm) 而不是 PaaS (web-app)。但是,我还添加了检查以下选项:“在目标位置删除其他文件”和“从 App_Data 文件夹中排除文件”
      【解决方案7】:

      只需添加

      <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
      

      到您的发布配置文件 (.pubxml)。

      【讨论】:

        【解决方案8】:
        1. 停止应用服务
        2. 部署代码
        3. 启动应用服务

        【讨论】:

          【解决方案9】:

          在您为此打开过多的蠕虫之前,请等待 30-60 秒,然后尝试再次发布您的应用。似乎有时会发生这种情况,因为向服务发出的停止请求要么在服务完全停止之前返回,要么可能 Visual Studio 没有等待足够长的时间来完成此操作。每次我遇到问题时,等待并重试发布第二次。

          【讨论】:

            【解决方案10】:

            asp.net core 项目有一些专门的任务,因为部署过程有点不同。
            你可以从市场上免费获得这些,查看DNX Tasks vsts marketplace
            希望对您有所帮助!

            【讨论】:

              【解决方案11】:

              Eddie 的回答接近我的需要,唯一缺少的是指定部署槽的方法:

              stopapp.ps1

              param($websiteName, $websiteSlot)
              $website = Get-AzureWebsite -Name $websiteName -Slot $websiteSlot
              Stop-AzureWebsite -Name $websiteName -Slot $websiteSlot
              

              startapp.ps1

              param($websiteName, $websiteSlot)
              $website = Get-AzureWebsite -Name $websiteName -Slot $websiteSlot
              Start-AzureWebsite -Name $websiteName -Slot $websiteSlot
              

              然后在您的 Azure PowerShell 任务中,脚本参数可能是这样的:

              -websiteName "{mywebsite}" -websiteSlot "{mydeploymentslot}"
              

              【讨论】:

                【解决方案12】:

                我的是一个本地发布管道,这就是我所做的。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-11-06
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多