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

Azure Web App deploy: Web Deploy cannot modify the file on the destination because it is locked by an external process

我正在使用 VSTS 中的 "Azure Web App Deployment" 构建步骤将 ASP.NET 核心 API 发布到 Azure Web 应用程序:

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

[error]Microsoft.Web.Deployment.DeploymentDetailedClientServerException: Web Deploy cannot modify the file 'MyProject.Api.exe' on the destination because it is locked by an external process. In order to allow the publish operation to succeed, you may need to either restart your application to release the lock, or use the AppOffline rule handler for .Net applications on your next publish attempt. Learn more at: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE.

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

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

您可以创建两个 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 应用程序并在部署后启动应用程序。

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}"

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

MSDEPLOY_RENAME_LOCKED_FILES = 1

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

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

我也在为同样的锁定问题苦苦挣扎。
现在有一个新任务(预览版),您可以添加它来启动和停止应用服务:

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

这对我有用。

您可以重启函数应用解除锁定。之后你应该可以部署了。

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

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

  1. 右键单击您的项目并select编辑....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 本身做到这一点。

希望对您有所帮助

只需添加

<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>

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

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

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