当 dll 文件更改时重新加载 ASP.NET Core 应用程序(bin 部署)

lon*_*nix 5 asp.net ubuntu kestrel-http-server asp.net-core asp.net-core-2.1

环境:ASP.NET Core 2.1,Ubuntu。

在旧式 ASP.NET 中,当我进行 bin 部署(例如上传一些 dll 文件)时,webapp 会检测到并重新加载自己 - 非常有用。

使用 Core,它不会那样做。我需要停止并重新启动该dotnet MyApp.dll过程。

如何让它检测对二进制文件的更改并重新加载?

Xee*_*vis 5

Ubuntu 中的文件观察器可以在文件更改时发出重启命令,例如systemdinotify,但我强烈建议不要这样做。上传可能会暂停或变慢,当上传 50 个文件时,想象一下每隔几秒钟重新启动一次。服务器无法知道您何时完成了最后一个 DLL 的上传。IIS 有同样的问题,它在开发中是可靠的,因为您在完整的 DLL 重建后刷新页面。但是在生产中,您不希望随机访问者在您的网站仍在上传时中途启动您的网站。错误、文件锁定、各种奇怪的事情都可能发生。

正如 Chris Pratt 所指出的,您希望编写部署工作流程的脚本。不知道你在什么环境下开发,但如果你有 Visual Studio 和 WinSCP,它就像使用Scripting 和 Task Automation编写几行代码一样简单。

那么您的发布工作流程可以如下所示:

  1. 在 Visual Studio 中点击发布
  2. 发布完成后VS会执行winscp脚本
    • 在远程服务器上进行身份验证
    • 将发布文件夹上传到远程文件夹
    • 删除旧文件
    • 修剪原木
    • 完成后发出systemctl restart kestrel-myapp命令
  3. 然后,只需单击一下,即可以最可靠的方式部署、清理和重新启动您的站点。


Chr*_*att 1

据我所知,没有什么可以为你做到这一点。IIS 会监视目录、web.config 等内容bin,并在检测到更改时回收应用程序池,但那是因为它知道这样做。它也是一个功能齐全的网络服务器,文件更改时的应用程序池回收就是其中之一。Kestrel,我认为您使用的不是. 它是一个非常简单的 Web 服务器,它只执行严格的 Web 服务器所需的操作。这就是为什么更传统的 Web 服务器(如 IIS、Apache、Nginx 等)通常用作 Kestrel 前面的反向代理 - 以提供更高级的功能。

尽管如此,这实际上只是您的发布策略的问题。就我个人而言,我鼓励您使用比复制粘贴 DLL 更强大的东西,但如果您想走这条路,您也可以编写脚本。创建一个 shell 脚本来复制该bin目录重新启动您的应用程序。你的版本应该尽可能是单轨的。每次需要人为干预时,都会有潜在的失败点,因为人类本质上容易犯错。然而,一旦测试并确保脚本能够工作,脚本几乎每次都会工作,因为它总是以相同的顺序执行相同的操作。