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

Reload ASP.NET Core app when dll files change (bin deploy)

环境:ASP.NET核心 2.1,Ubuntu。

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

对于 Core,它不会那样做。我需要停止并重新启动 dotnet MyApp.dll 进程。

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

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

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

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

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

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

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