【问题标题】:Is there any way to "Hot Publish" a .NET Core application?有没有办法“热发布”一个 .NET Core 应用程序?
【发布时间】:2019-10-28 22:58:55
【问题描述】:

我希望将一些 .NET Core 应用程序投入生产,并且使用旧的 .NET 框架,您可以随时更新应用程序代码的已编译 DLL。

下次回收应用程序池时,您将获得新代码 - 或者您可以手动回收应用程序池。

使用 .NET Core,正在运行的应用程序似乎会锁定 DLL,并且在进程因不活动而关闭或通过任务管理器(此处为 Window 的服务器)结束之前无法覆盖它。

在不必为所有用户设置维护窗口的情况下发布新版本的首选方法是什么?这是在通过 IIS 8 运行 .NET Core 框架的 Windows 2012 R2 服务器和没有托管代码的应用程序池上。

【问题讨论】:

标签: asp.net-core iis-8 asp.net-core-1.0


【解决方案1】:

对于使用 Kestrel 托管的 ASP.NET Core,它在单独的进程中运行,并且 IIS 的工作方式类似于反向代理。因此,除非您在自己的应用程序中实现 DLL,否则无法发布 DLL。

Set up a hosting environment for ASP.NET Core on Windows with IIS, and deploy to it 部分部署应用程序,第 4 项。

如果您想避免停机,只需在 IIS 上使用相同的设置设置两个网站,在第二个网站上进行更新,先放下,然后再开始。

【讨论】:

  • 我已经尝试过了,并排有两个目录,然后将路径更改为新目录。这两种方法都会关闭所有当前线程并启动一个新进程,对所有当前请求抛出 500 个错误,因此不是理想的解决方案。我想出的最好的方法是在安静的时期,启动复制,等到它锁定,然后回收应用程序池并继续复制 - 如果我熟练使用鼠标和手指,它通常会及时复制。
【解决方案2】:

我认为最简单的方法是将所有文件复制到一个新文件夹并更改网站的物理路径。

例如,您拥有C:\WebSites 下的所有网站,您还拥有每个网站的子文件夹,例如C:\WebSites\MyWebSite,以及每个版本的子文件夹,例如C:\WebSites\MyWebSite\V01.00。

要部署新版本V01.01,请创建一个新的子文件夹C:\WebSites\MyWebSite\V01.01,将所有文件复制到该文件夹​​并更改网站的物理路径。

您可以使用 PowerShell 轻松更改物理路径:

Import-Module WebAdministration
Set-ItemProperty -Path "IIS:\Sites\MyWebSite" -name "physicalPath" -value "C:\WebSites\MyWebSite\V01.01"

这是“热发布”的一种形式。此外,如果出现问题,您可以轻松回滚到以前的版本。

另一种选择是使用符号链接,例如C:\WebSites\MyWebSite 可能指向C:\WebSiteVersions\MyWebSite\V01.00。要部署新版本,将所有文件复制到C:\WebSiteVersions\MyWebSite\V01.01,然后更改符号链接,使C:\WebSites\MyWebSite 指向C:\WebSiteVersions\MyWebSite\V01.01,最后回收应用程序池。 Click here 查看代码

还有另一个选项称为“蓝绿部署”策略。此策略需要配置一个服务器网络场和两个网站。完整说明请参见this article。

【讨论】:

  • 当您更改 IIS 应用程序的路径时,它会终止应用程序池进程(而不是进行重叠回收),因此正在进行的请求会被简单地中止。然而,符号链接解决方案要好得多,感谢您的想法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-28
  • 2019-07-07
  • 2019-03-15
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多