【问题标题】:Are Asp.Net Core 3.1 IHost implementations designed to be restartable?Asp.Net Core 3.1 IHost 实现是否设计为可重新启动?
【发布时间】:2020-04-28 12:37:30
【问题描述】:

如果我有一个使用HostBuilder 构建的Host 实例,然后我调用StartAsync(),然后调用StopAsync(),然后在未来某个时间我再次调用StartAsync(),它应该可以工作吗?

我查看了 ASP.NET Core 源代码,HostKestrelServer 的编写方式表明您不应在调用 StopAsync() 后重用它们;

问题在于它引发了异常 - 看起来它没有考虑重新启动:https://github.com/dotnet/extensions/blob/release/3.1/src/Hosting/Hosting/src/Internal/Host.cs#L44

Host 实例是否可重新启动?

【问题讨论】:

    标签: asp.net-core .net-core


    【解决方案1】:

    从技术上讲,是的,它们是可重新启动的,或者至少,从技术上讲,没有什么可以阻止您再次致电 StartAsync。但是,这里有一个实际限制。您在最低级别拥有的是一个控制台应用程序,它只运行Program.Main 然后返回。该应用程序无法继续运行;它退出。除其他外,StartAsync 开始侦听套接字,这会导致应用程序“挂起”,因为它无法继续和退出。当您拨打StopAsync 时,此监听将停止,然后应用程序将立即继续并最终退出。一旦控制台应用程序退出,您显然不能再次调用StartAsync,因为不再有任何运行。在调用StopAsync 之后,您必须以某种方式使应用程序挂起,然后再次调用StartAsync,但这没有真正的功能意义。此外,停止您打算稍后重新开始的任何事情是没有意义的。如果什么都没有发生,那么它实际上并没有做任何事情。它占用了少量的基础资源,但如果这是一个问题,那么您一开始就远离资源受限,因为它就像不到 100MB 或 RAM,而且几乎没有 CPU 周期。

    【讨论】:

    • 好吧,我有一个控制台应用程序,它执行其他长时间运行的操作,我想启动一个 HTTP 服务器并做一些工作,然后停止它,然后重新启动它。
    • 对不起,但这也没有任何意义。运行 HTTP 服务器的唯一原因是为了 external 交互,即其他能够发出请求的东西。根据定义,您不能只在外部事物需要时启动服务器,因为它是外部的。如果你有足够的控制权来协调它,那么它不应该是你首先协调的东西。它应该只是同一个应用程序的一部分。
    • 问题是它抛出异常,我找到了源代码,看起来它没有考虑重新启动。 github.com/dotnet/extensions/blob/release/3.1/src/Hosting/…
    • 我的问题是“它可以重新启动吗?”不是“重新启动它是否有意义。” :)
    • 这听起来像是 XY 问题。你有问题 X,你决定用 Y 解决,但 Y 不起作用。首先,您不是询问 X,您的实际问题,而是询问 Y,这甚至不是 X 的一个好的解决方案。您实际上想在这里实现什么目标?
    猜你喜欢
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 2020-12-07
    • 2022-12-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多