Развертывание Azure Web App: Web Deploy не может изменить файл в месте назначения, так как он заблокирован внешним процессом
Я использую шаг сборки "Развертывание веб-приложения Azure" в VSTS для публикации основного API-интерфейса ASP.NET в веб-приложении 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 и сделал следующие шаги.
- Щелкните правой кнопкой мыши по вашему проекту и выберите Edit ....csproj
добавлять
<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
в теге PropertyGroup<PropertyGroup> <TargetFramework>netcoreapp2.1</TargetFramework> <AzureFunctionsVersion>v2</AzureFunctionsVersion> <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline> </PropertyGroup>
Сохраните и восстановите ваше решение
Теперь опубликуйте снова
Если это не сработало для вас, вы всегда можете добавить 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 недостаточно долго ожидает завершения этой операции. Каждый раз, когда я сталкивался с проблемой, ожидание и повторная попытка публикации работало во второй раз.
Ответ Эдди был близок к тому, что мне было нужно, единственное, чего не хватало, был способ указать место для развертывания:
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
Надеюсь, это поможет!!