【问题标题】:Gracefully stop .NET Core server with console or client action使用控制台或客户端操作优雅地停止 .NET Core 服务器
【发布时间】:2022-02-25 21:38:40
【问题描述】:

我正在将一些服务器应用程序从 .NET Framework+WCF 移植到 .NET Core,但在管理服务器出口时遇到了问题。在我们当前的 WCF 服务器上,我们允许从 WCF 请求和控制台输入中退出:

    static void Main()
    {
        hExit = new ManualResetEvent(false);
        StartServer();

        Console.WriteLine("Server started. Press [Enter] to quit.");
        char key;
        while((key=WaitForKeyOrEvent(hExit)) != '\0' && key != '\r') { }
        Console.WriteLine();

        StopServer();
    }

    private static char WaitForKeyOrEvent(System.Threading.WaitHandle hEvent)
    {
        const int Timeout = 500;
        bool dueToEvent = false;
        while(!Console.KeyAvailable)
        {
            if(hEvent.WaitOne(Timeout, false))
            {
                dueToEvent = true;
                break;
            }
        }
        char ret = '\0';
        if(!dueToEvent)
        {
            ret = Console.ReadKey().KeyChar;
            if(ret == '\0')
                ret = char.MaxValue;
        }
        return ret;
    }

    ...

    class ServerObj : IMyWcfInterface
    {
        void IMyWcfInterface.ExitServer() { hExit.Set(); }
    }

这种方法是否也适用于 .NET Core? (当然使用 WCF 以外的其他技术,因为它已被放弃)我隐约记得听说 KeyAvailable/ReadKey 可能不适用于 Docker 容器中的应用程序,而使用容器是迁移到 . NET 核心...

【问题讨论】:

  • 通过命令杀死进程线程?

标签: asp.net-core console .net-5 dotnet-cli


【解决方案1】:

通常,在容器中运行时,您通常无法访问输入设备(想想键盘)。因此,该选项在容器化应用程序中并不可靠。

侦听某种网络请求(例如,HTTP、grpc、protobuf)可以工作,但您必须确保请求的来源是有效的,并且不是恶意实体攻击您的应用程序并强制它关闭。

容器环境(例如,Kubernetes、Docker)中的惯用方法是容器引擎向您的应用程序发送 Linux 信号,例如 SIGTERMdocker stop 会这样做,Kubernetes 在停止你的 Pod 时也会这样做。然后,您的应用程序应处理该问题并正确关闭。

根据您是否使用 ASP.NET Core,实现会有所不同。

在 ASP.NET Core 中,您可以使用 IApplicationLifetime.ApplicationStopping 注册一些代码,以便在应用程序停止时调用。

这是涵盖实现方面的 StackOverflow 答案:graceful shutdown asp.net core

如果您不使用 ASP.NET Core,您可以处理 AppDomain.ProcessExit 来注册一个处理程序,以便在应用程序停止时调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多