使用Microsoft.AspNet.Server.Kestrel
时是否有关机功能? ASP.NET Core(以前的ASP.NET vNext)显然有一个启动序列,但没有提到关闭序列以及如何处理干净的闭包。
答案 0 :(得分:38)
在ASP.NET Core中,您可以注册IApplicationLifetime
public class Startup
{
public void Configure(IApplicationBuilder app, IApplicationLifetime applicationLifetime)
{
applicationLifetime.ApplicationStopping.Register(OnShutdown);
}
private void OnShutdown()
{
// Do your cleanup here
}
}
IApplicationLifetime
还公开了ApplicationStopped
和ApplicationStarted
的取消令牌以及停止申请的StopApplication()
方法。
答案 1 :(得分:21)
除了原始答案之外,我在尝试连接构造函数中的IApplicationLifetime时遇到错误。
我通过以下方式解决了这个问题:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
var applicationLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>();
applicationLifetime.ApplicationStopping.Register(OnShutdown);
}
private void OnShutdown()
{
// Do your cleanup here
}
}
答案 2 :(得分:1)
该类现在已过时,请参考新界面 IHostApplicationLifetime 。更多信息here。
答案 3 :(得分:1)
我通过应用程序生命周期回调事件解决了该问题
Startup.cs
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();
});
}
Program.cs
另外,在构建主机时使用UseConsoleLifetime()
。
Host.CreateDefaultBuilder(args).UseConsoleLifetime(opts => opts.SuppressStatusMessages = true);