Развертывание Azure Web App: Web Deploy не может изменить файл в месте назначения, так как он заблокирован внешним процессом

Я использую шаг сборки "Развертывание веб-приложения Azure" в VSTS для публикации основного API-интерфейса ASP.NET в веб-приложении Azure:

Развертывание веб-приложения Azure

Иногда этот шаг прерывается со следующей ошибкой:

[ошибка]Microsoft.Web.Deployment.DeploymentDetailedClientServerException: Web Deploy не может изменить файл "MyProject.Api.exe" в месте назначения, поскольку он заблокирован внешним процессом. Чтобы разрешить операцию публикации, вам может потребоваться либо перезапустить приложение, чтобы снять блокировку, либо использовать обработчик правил AppOffline для приложений.Net при следующей попытке публикации. Узнайте больше по адресу: http://go.microsoft.com/fwlink/?LinkId=221672.

Эта проблема GitHub поднимает ту же проблему, но не предлагается решение с использованием шага сборки Azure Web App Deployment.

12 ответов

Решение

Что касается отдельного потока в репозитории Microsoft Github, здесь есть хитрый обходной путь, при котором, если вы добавите следующий ключ в настройки приложений Azure, это может помочь устранить ошибку развертывания заблокированного файла:

MSDEPLOY_RENAME_LOCKED_FILES = 1

Я не уверен, как долго будет поддерживаться этот взлом приложений, но он помог решить проблему лично для меня.

Я боролся с той же проблемой блокировки.
Теперь есть новые задачи (в режиме предварительного просмотра), которые можно добавить для запуска и остановки службы приложений:

Добавьте задачу остановки перед развертыванием и задачу запуска после развертывания.

Это помогло мне.

Вы можете перезапустить приложение Function, чтобы снять блокировку. После этого вы сможете развернуть.

Я получал ту же ошибку, когда пытался опубликовать свое приложение-функцию Azure. Я следовал этому документу Microsoft и сделал следующие шаги.

  1. Щелкните правой кнопкой мыши по вашему проекту и выберите Edit ....csproj
  2. добавлять <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline> в теге PropertyGroup

    <PropertyGroup>
      <TargetFramework>netcoreapp2.1</TargetFramework>
      <AzureFunctionsVersion>v2</AzureFunctionsVersion>
      <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
    </PropertyGroup>
    
  3. Сохраните и восстановите ваше решение

  4. Теперь опубликуйте снова

Если это не сработало для вас, вы всегда можете добавить MSDEPLOY_RENAME_LOCKED_FILES=1 как отметил г-н Бен в своем ответе, в настройках вашего приложения. Вы можете сделать это из самой Visual Studio.

Надеюсь, поможет

Вы можете создать два сценария 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", чтобы остановить веб-приложение перед развертыванием и запустить приложение после развертывания. введите описание изображения здесь

Перевод веб-сайта в автономный режим при выпуске должен помочь.

введите описание изображения здесь

Просто добавьте

<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>

в свой профиль публикации (.pubxml).

Прежде чем открывать слишком много банок с червями, подождите 30–60 секунд и попробуйте опубликовать приложение во второй раз. Похоже, что это иногда происходит из-за того, что запрос остановки, который отправляется службе, либо возвращается до того, как служба полностью остановлена, либо, возможно, Visual Studio недостаточно долго ожидает завершения этой операции. Каждый раз, когда я сталкивался с проблемой, ожидание и повторная попытка публикации работало во второй раз.

  1. Остановить службу приложения
  2. развернуть код
  3. Запустить сервис приложений

Ответ Эдди был близок к тому, что мне было нужно, единственное, чего не хватало, был способ указать место для развертывания:

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

Для основных проектов asp.net есть несколько специальных задач, потому что процесс развертывания немного отличается.
Вы можете получить их с рынка бесплатно, ознакомьтесь с DNX Tasks vsts marketplace
Надеюсь, это поможет!!

Мой конвейер выпуска onprem, и это то, что я сделал.