我正在 VSTS 中使用“Azure Web 应用程序部署”构建步骤将 ASP.NET Core API 发布到 Azure Web 应用程序:
有时,此步骤会因以下错误而中断:
[错误]Microsoft.Web.Deployment.DeploymentDetailedClientServerException: Web 部署无法修改文件“MyProject.Api.exe” 目的地,因为它被外部进程锁定。 为了 允许发布操作成功,您可能需要重新启动 您的应用程序释放锁定,或使用 AppOffline 规则 下次尝试发布时.Net 应用程序的处理程序。 学习 更多信息请参见: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE。
此 GitHub 问题 提出了相同的问题,但没有使用 Azure Web 应用程序部署构建步骤的建议解决方案。
根据 Microsoft Github 存储库中的单独线程此处,有一个巧妙的解决方法,如果您将以下密钥添加到 Azure Appsettings,它可以帮助解决锁定文件部署错误:
MSDEPLOY_RENAME_LOCKED_FILES = 1
我不确定这个应用程序设置黑客将支持多长时间,但它确实帮助我个人解决了这个问题。
当我尝试发布我的 Azure Function App 时,我遇到了同样的错误。我按照this Microsoft 文档并执行了以下步骤。
在PropertyGroup标签中添加
<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
<PropertyGroup>
<TargetFramework>netcoreapp2.1</TargetFramework>
<AzureFunctionsVersion>v2</AzureFunctionsVersion>
<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
</PropertyGroup>
保存并重建您的解决方案
现在再次发布
如果这对您不起作用,您可以随时将
MSDEPLOY_RENAME_LOCKED_FILES=1
添加到您的应用程序设置中,正如 Ben 先生在他的回答中提到的那样。您可以从 Visual Studio 本身执行此操作。
希望有帮助
您可以创建两个 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 应用程序并在部署之后启动应用程序。
只需添加
<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
到您的发布配置文件(.pubxml)。
在您打开太多蠕虫罐头之前,请等待 30-60 秒,然后尝试再次发布您的应用程序。有时会发生这种情况,因为向服务发出的停止请求要么在服务完全停止之前返回,要么 Visual Studio 没有等待足够长的时间来完成此操作。每次我遇到问题时,等待并重试发布第二次都会成功。
asp.net core 项目有一些专门的任务,因为部署过程有点不同。
您可以从市场免费获取这些内容,请查看 DNX Tasks vsts 市场
希望有帮助!!
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}"
我遇到了同样的问题,与 Visual Studio 或 Webdeploy 无关。我在升级到最新版本的.net core 8时服务器出现了一些问题。然后我直接在服务器上运行MyAPI.exe文件进行测试,但从未关闭它。这就是导致我在下次部署时锁定的原因。
愚蠢的错误,但我希望它可以帮助别人