【问题标题】:Reload ASP.NET Core app when dll files change (bin deploy)dll 文件更改时重新加载 ASP.NET Core 应用程序(bin 部署)
【发布时间】:2019-02-11 18:22:37
【问题描述】:

环境:ASP.NET Core 2.1,Ubuntu。

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

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

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

【问题讨论】:

    标签: asp.net ubuntu asp.net-core asp.net-core-2.1 kestrel-http-server


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,红隼没有内置这个功能——因为它已经在监视appsettings.json的变化,所以从技术上讲,它应该可以实现。我想我会像你说的那样编写脚本。
    • 嗯,它不是内置的,因为它不是真正受支持的部署方案。热交换 DLL 并不是真正的部署策略。
    • 我在 repo 中添加了一个功能请求,看起来他们会考虑的。
    • “并在检测到更改时回收应用程序池” - 这是错误的,它不会回收,它会重新加载应用程序域。回收 - 正在启动一个新的 w3wp 进程并优雅地关闭旧进程。热重载保持在同一个 w3wp 进程中。
    【解决方案2】:

    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. 然后只需单击一下,即可以最可靠的方式部署、清理和重新启动您的站点。

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2016-08-10
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 2019-07-25
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多