发布时站点DLL似乎间歇性被锁定

问题描述 投票:0回答:2

我尝试通过 VS2017 中的“发布”上下文菜单将我的 .net core 站点部署到 Azure,偶尔(大约三分之一的部署),我会收到以下错误。

Web部署任务失败。 (Web Deploy无法修改该文件 目标上的“MyCoreWebSite.dll”,因为它被锁定 外部过程。 为了让发布操作成功, 您可能需要重新启动应用程序才能释放锁定, 或者在您的下一个 .Net 应用程序中使用 AppOffline 规则处理程序 发布尝试。 了解更多信息: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE。)

然后我会等一下,再试一次,就会成功。 同时,我将运行 handle 实用程序来查找锁定 DLL 的任何内容,但它从未找到任何内容。

这是一个错误还是我错过了一些简单的东西?

.net asp.net-core .net-core visual-studio-2017 webdeploy
2个回答
9
投票

ASP.NET Core 不支持文件的卷影复制,这意味着 ASP.NET Core 进程 (Kestrel) 将保持对这些文件的锁定。您可以解决这个问题:

  1. 在发布之前提供一个
    app_offline.htm
    页面,然后将其删除。我认为发布配置文件中对此有自动支持(
    <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
    )。但如果需要,您可以使用自定义部署脚本来完成此操作。在 ASP.NET Core 1.x 中,我还必须在 Startup.cs 文件中添加一个文件监视任务来关闭当前进程。不知道ASP.NET Core 2.0是否还需要。
  2. 1. 的缺点是您的网站在发布过程中会离线。如果您不希望使用站点的副本:将所有文件复制到子目录(例如
    \PREVIOUS
    ),更改 web.config 中的标签,使其指向新文件中的 .exe子目录。现在根目录中的所有锁都应该消失了...发布您的网站并随后再次更改 web.config。
  3. 如果您的网站是负载平衡的,您当然可以从池中取出一台服务器,更新它并在完成后将其添加回池中。

更多信息

https://devblogs.microsoft.com/dotnet/web-publishing-updates-for-app-offline-and-usechecksum/


0
投票

就我而言(Blazor Net 8),发布到文件夹这不起作用。

解决方案: 发布前使用 powershell 添加 App_Offline.htm:

  1. 添加到您的 PublishProfile(例如 /Properties/Publishprofile/FolderProfile.pubxml)值

    <IsPublish>True</IsPublish>

  2. 转到您的项目文件并添加以下内容:

<Target Name="MessageBeforePublish" AfterTargets="Build" Condition="'$(IsPublish)' == 'True'">
        <Message Text="Before publishing...$(PublishUrl)" Importance="high" />
        <Exec Command="powershell -Command &quot;$null = New-Item -Path '$(PublishUrl)' -Name 'App_Offline.htm' -ItemType 'file'&quot;" />
</Target>

发布后删除:

<Target Name="MessageAfterPublish" AfterTargets="Publish" Condition="'$(IsPublish)' == 'True'">
    <Message Text="After publishing...$(PublishUrl)" Importance="high" />
    <Exec Command="powershell -Command &quot;$null = Remove-Item -Path '$(PublishUrl)\App_Offline.htm'&quot;" />
</Target>
© www.soinside.com 2019 - 2024. All rights reserved.