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



环境:ASP.NET Core 2.1,Ubuntu。

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

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

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

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

正如 Chris Pratt 所指出的,您希望编写部署工作流的脚本。知道你在什么环境中开发,但如果你有Visual Studio和WinSCP,就像使用脚本和任务自动化编写几行代码一样简单。

然后,您的发布工作流可以如下所示:

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

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

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