我尝试通过 VS2017 中的“发布”上下文菜单将我的 .net core 站点部署到 Azure,偶尔(大约三分之一的部署),我会收到以下错误。
Web部署任务失败。 (Web Deploy无法修改该文件 目标上的“MyCoreWebSite.dll”,因为它被锁定 外部过程。 为了让发布操作成功, 您可能需要重新启动应用程序才能释放锁定, 或者在您的下一个 .Net 应用程序中使用 AppOffline 规则处理程序 发布尝试。 了解更多信息: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE。)
然后我会等一下,再试一次,就会成功。 同时,我将运行 handle 实用程序来查找锁定 DLL 的任何内容,但它从未找到任何内容。
这是一个错误还是我错过了一些简单的东西?
ASP.NET Core 不支持文件的卷影复制,这意味着 ASP.NET Core 进程 (Kestrel) 将保持对这些文件的锁定。您可以解决这个问题:
app_offline.htm
页面,然后将其删除。我认为发布配置文件中对此有自动支持(<EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
)。但如果需要,您可以使用自定义部署脚本来完成此操作。在 ASP.NET Core 1.x 中,我还必须在 Startup.cs 文件中添加一个文件监视任务来关闭当前进程。不知道ASP.NET Core 2.0是否还需要。\PREVIOUS
),更改 web.config 中的标签,使其指向新文件中的 .exe子目录。现在根目录中的所有锁都应该消失了...发布您的网站并随后再次更改 web.config。https://devblogs.microsoft.com/dotnet/web-publishing-updates-for-app-offline-and-usechecksum/
就我而言(Blazor Net 8),发布到文件夹这不起作用。
解决方案: 发布前使用 powershell 添加 App_Offline.htm:
添加到您的 PublishProfile(例如 /Properties/Publishprofile/FolderProfile.pubxml)值
<IsPublish>True</IsPublish>
转到您的项目文件并添加以下内容:
<Target Name="MessageBeforePublish" AfterTargets="Build" Condition="'$(IsPublish)' == 'True'">
<Message Text="Before publishing...$(PublishUrl)" Importance="high" />
<Exec Command="powershell -Command "$null = New-Item -Path '$(PublishUrl)' -Name 'App_Offline.htm' -ItemType 'file'"" />
</Target>
发布后删除:
<Target Name="MessageAfterPublish" AfterTargets="Publish" Condition="'$(IsPublish)' == 'True'">
<Message Text="After publishing...$(PublishUrl)" Importance="high" />
<Exec Command="powershell -Command "$null = Remove-Item -Path '$(PublishUrl)\App_Offline.htm'"" />
</Target>