【发布时间】:2018-11-28 06:46:30
【问题描述】:
我有一个从我的 NodeJS Web 应用程序调用的 .NET Core 应用程序(这个 .NET Core 应用程序是从 .NET Framework 迁移到在 Linux 服务器上运行以执行一些特定任务)。
到目前为止,它工作正常,但每次我覆盖 .dll 文件(以更新应用程序)时,应用程序的所有运行实例都会自动关闭,没有任何异常或任何情况。好像我会调用 Environment.Exit()。所有正在进行的工作都消失了,调用 NodeJS 服务只收到一个空响应。
我不太明白这样做的必要性,因为 Linux 允许在文件运行时覆盖它... 可能它是这样工作的,以确保 Web 服务器在其 .dll 更新时重新启动。但在我的情况下,这种行为是不受欢迎的,我希望有一种方法可以禁用它。 试图用谷歌搜索,但找不到任何关于此事的信息。
提前感谢您的任何建议:)
【问题讨论】:
-
考虑到 .NET 应用程序,这是正常行为。当某些事情发生变化时,“应用程序池”会被回收。当然是在纠正中说的,所以你最初的观察是正确的。我们所做的是在两者之间有 2 个反向代理负载平衡。我们将使一个离线,更新 .NET Core 代码,使其在线并取下另一个进行更新,这样可以保留目前对其进行的任何/所有调用。不完全确定您的设置或为什么所有 WIP 都会消失,但这就是我们有维护窗口和后备的原因:)
-
嗯,我们没有将 .NET Core 应用程序用作 Web 服务器,而是用作独立的控制台应用程序,它从 NodeJS Web 服务器调用,运行一些工作并返回结果。因此,如果它意外终止,所有工作已经丢失,因为调用 NodeJS 服务没有收到任何结果,并且下次将再次调用该应用程序以从头开始工作。我正在寻找一种以某种方式禁用此行为的方法...我不需要重新启动应用程序。我对下一次运行更新版本感到满意,而这次它可以按原样完成工作。
-
请记住,即使在 Linux 上,您也可以覆盖任何您想要的内容,还必须重新启动服务才能使更新的更改生效,因为内存中的内容与新的 dll 不匹配。在所有情况下,对 DLL 的更新都会启动重新启动(或至少必须启动),这不是您可以摆脱的行为。有一些方法可以绕过它,使用 ShadowCopy/Assembly,然后当它发生变化时,发送通知以等待线程完成并正常更新。只是从我这边推测,但您可能需要将您的 exe 包装在另一个 exe 中进行更新检查
-
在this post 中查找关于为什么锁定程序集如此重要的背景信息。不知道他们是如何在 Linux 上做到这一点的,但应用程序必须重启应该从帖子中显而易见。
-
嗯,这在 Windows 中或对于像 Web 服务器这样的 服务 来说非常棒,但对于按需调用以一次执行单个任务的独立应用程序来说,这显然是一种可怕的行为。它肯定会为下一个任务再次启动,因此使用新的 .dll 版本,不需要强制重启......看来我必须实现某种“在启动前复制 -> 执行 ->删除副本”的方法...