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

时间:2016-06-20 09:13:26

标签: azure azure-web-sites azure-devops azure-pipelines-build-task azure-pipelines

我正在使用" Azure Web App部署"在VSTS中构建步骤以将ASP.NET Core API发布到Azure Web App:

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

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

12 个答案:

答案 0 :(得分:32)

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

MSDEPLOY_RENAME_LOCKED_FILES = 1

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

enter image description here

答案 1 :(得分:8)

您可以创建两个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 PowerShell"之前和之后的任务" Azure Web App部署"任务是在部署之前停止Web应用程序并在部署后启动应用程序。 enter image description here

答案 2 :(得分:8)

我正在努力解决同样的锁定问题 现在有一个新的任务(在预览中)可以添加以启动和停止App Service:

enter image description here

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

enter image description here

这对我有用。

答案 3 :(得分:3)

您可以重新启动功能应用以释放锁定。之后,您应该能够部署。

enter image description here

答案 4 :(得分:2)

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

enter image description here

答案 5 :(得分:2)

当我尝试发布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. 现在再次发布

如果这对您不起作用,则可以始终将Ben先生在回答中提到的MSDEPLOY_RENAME_LOCKED_FILES=1添加到“应用程序”设置中。您可以从Visual Studio本身完成此操作。

enter image description here

enter image description here

希望有帮助

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

  1. 停止应用服务
  2. 部署代码
  3. 启动应用服务
  4. enter image description here

答案 9 :(得分:0)

Juste添加

<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>

到您的发布个人资料(.pubxml)。

答案 10 :(得分:0)

在打开太多蠕虫病毒之前,请等待30至60秒钟,然后尝试第二次发布您的应用程序。似乎出现这种情况有时是因为发出给服务的停止请求或者在服务完全停止之前返回,或者Visual Studio等待的时间不足以完成此操作。每次遇到问题时,第二次等待并重试发布都是有效的。

答案 11 :(得分:0)

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

Take app offline