我怎么知道Kestrel什么时候开始听?

时间:2017-06-20 20:46:22

标签: c# asp.net-core kestrel

我需要通知systemd我的服务已成功启动,并且启动后需要运行的任务要求服务器已在目标Unix域套接字上监听

我正在使用IWebHost::Run启动服务器,这是一个阻塞调用。此外,我无法找到任何明显的方法来设置委托或回调事件以成功初始化。

任何?

4 个答案:

答案 0 :(得分:3)

  • .Net Core 1.x上运行IWebHost.Start()是安全的,并假设服务器之后被初始化(而不是阻塞线程的Run())。查看source

    var host = new WebHostBuilder()
        .UseKestrel()
        (...)
        .Build();
    
    host.Start();
    
  • 如果您正在使用.NET Core 2.0 Preview 1(或更高版本),source is different,则同步方法不再可用,因此您应等待IWebHost.StartAsync()并假设事后已准备就绪。

答案 1 :(得分:2)

您可以使用Microsoft.AspNetCore.Hosting.IApplicationLifetime

/// <summary>
/// Triggered when the application host has fully started and is about to wait
/// for a graceful shutdown.
/// </summary>
CancellationToken ApplicationStarted { get; }

请查看此SO post以获取配置示例。

答案 2 :(得分:1)

这就是我最终的目标。似乎工作正常:

host.Start();

Log.Information("Press Ctrl+C to shut down...");
Console.CancelKeyPress += OnConsoleCancelKeyPress;

var waitHandles = new WaitHandle[] {
    CancelTokenSource.Token.WaitHandle
};

WaitHandle.WaitAll(waitHandles);
Log.Information("Shutting down...");

然后,在Ctrl + C事件处理程序中:

private static void OnConsoleCancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
    Log.Debug("Got Ctrl+C from console.");
    CancelTokenSource.Cancel();
}

答案 3 :(得分:0)

这就是我为克服此问题所做的事情。

1-我注册了ApplicationStopped事件。这样它就可以通过调用当前进程的Kill()方法来终止应用程序。

public void Configure(IHostApplicationLifetime appLifetime) {
 appLifetime.ApplicationStarted.Register(() => {
  Console.WriteLine("Press Ctrl+C to shut down.");
 });

 appLifetime.ApplicationStopped.Register(() => {
  Console.WriteLine("Terminating application...");
  System.Diagnostics.Process.GetCurrentProcess().Kill();
 });
}

See IHostApplicationLifetime docs


2-在构建主机时不要忘记使用UseConsoleLifetime()

Host.CreateDefaultBuilder(args).UseConsoleLifetime(opts => opts.SuppressStatusMessages = true);

See useconsolelifetime docs