发布时,网站DLL似乎间歇性地被锁定

Ang*_*ker 4 .net webdeploy .net-core asp.net-core visual-studio-2017

我尝试通过VS2017中的Publish上下文菜单将我的.net核心站点部署到Azure,偶尔(大约1/3部署),我得到以下错误.

Web部署任务失败.(Web部署无法修改目标上的文件'MyCoreWebSite.dll',因为它被外部进程锁定.为了使发布操作成功,您可能需要重新启动应用程序以释放锁定,或者使用适用于下次发布尝试的.Net应用程序的AppOffline规则处理程序.有关详细信息,请访问:http://go.microsoft.com/fwlink/?LinkId = 221672 #ERROR_FILE_IN_USE .)

然后我会等待一分钟,再试一次它会起作用.同时,我将运行handle实用程序寻找锁定DLL的任何东西,它永远找不到任何东西.

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

Dav*_*ing 5

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. 如果您的网站负载均衡,您可以从池中取出一台服务器,更新它并在完成后将其添加回池中.

  • 4.将其部署到Azure上的"暂存"部署插槽,并在插槽上打开"自动交换插槽"选项,以便在加载后将其与实际站点交换. (2认同)