Azure Web App 部署:Web 部署无法修改目标上的文件,因为它被外部进程锁定

问题描述 投票:0回答:13

我正在 VSTS 中使用“Azure Web 应用程序部署”构建步骤将 ASP.NET Core API 发布到 Azure Web 应用程序:

Azure Web App Deployment

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

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

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

azure azure-web-app-service azure-devops azure-pipelines-build-task azure-pipelines
13个回答
53
投票

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

MSDEPLOY_RENAME_LOCKED_FILES = 1

我不确定这个应用程序设置黑客将支持多长时间,但它确实帮助我个人解决了这个问题。

enter image description here


19
投票

我也遇到了同样的锁定问题。
现在您可以添加一个新任务(预览版)来启动和停止应用服务:

enter image description here

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

enter image description here

这对我有用。


14
投票

您可以重启功能App来解除锁定。之后您应该能够部署。

enter image description here


13
投票

当我尝试发布我的 Azure Function App 时,我遇到了同样的错误。我按照this Microsoft 文档并执行了以下步骤。

  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 本身执行此操作。

enter image description here

enter image description here

希望有帮助


8
投票

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

stopapp.ps1:

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

启动应用程序.ps1:

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

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


7
投票

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

enter image description here


5
投票

只需添加

<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>

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


2
投票
  1. 停止应用程序服务
  2. 部署代码
  3. 启动应用服务

enter image description here


2
投票

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


0
投票

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


0
投票

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

停止应用程序.ps1

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

启动应用程序.ps1

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

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

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

0
投票

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

Take app offline


0
投票

我遇到了同样的问题,与 Visual Studio 或 Webdeploy 无关。我在升级到最新版本的.net core 8时服务器出现了一些问题。然后我直接在服务器上运行MyAPI.exe文件进行测试,但从未关闭它。这就是导致我在下次部署时锁定的原因。

愚蠢的错误,但我希望它可以帮助别人

© www.soinside.com 2019 - 2024. All rights reserved.