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

The site DLL seems to be intermittently locked when publishing

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

Web deployment task failed. (Web Deploy cannot modify the file 'MyCoreWebSite.dll' on the destination because it is locked by an external process. In order to allow the publish operation to succeed, you may need to either restart your application to release the lock, or use the AppOffline rule handler for .Net applications on your next publish attempt. Learn more at: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE.)

那我稍等一下,再试一次,它会成功的。同时,我将 运行 handle 实用程序寻找任何锁定 DLL 的东西,但它从未找到任何东西。

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

ASP.NET 核心 不支持影子复制 文件,这意味着 ASP.NET 核心进程 (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. 如果您的网站是负载平衡的,您当然可以从池中取出一台服务器,更新它并在完成后将其添加回池中。