【发布时间】:2016-02-07 18:23:47
【问题描述】:
使用Microsoft.AspNet.Server.Kestrel时有关机功能吗? ASP.NET Core(以前的 ASP.NET vNext)显然有一个启动序列,但没有提及关闭序列以及如何处理干净关闭。
【问题讨论】:
标签: c# asp.net-core
使用Microsoft.AspNet.Server.Kestrel时有关机功能吗? ASP.NET Core(以前的 ASP.NET vNext)显然有一个启动序列,但没有提及关闭序列以及如何处理干净关闭。
【问题讨论】:
标签: c# asp.net-core
在 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() 方法。
来自 cmets @Horkrine
对于 .NET Core 3.0+,建议改用 IHostApplicationLifetime,因为 IApplicationLifetime 很快就会被弃用。其余的仍然可以像上面写的那样与新服务一起工作
【讨论】:
IHostApplicationLifetime,因为IApplicationLifetime 很快就会被弃用。其余的仍将按照上面的说明与新服务一起工作
除了原始答案之外,我在尝试在构造函数中连接 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
}
}
【讨论】:
该类现已废弃,请参考新接口IHostApplicationLifetime。更多信息here。
【讨论】:
我通过应用程序生命周期回调事件解决了这个问题
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);
【讨论】:
appLifetime.ApplicationStopped.Register做什么?我不明白这有什么帮助。假设你在控制器中有一个未知的当前正在进行的请求,它可以是 1、10 或 1000,你不知道。你希望他们都完成。这种方法有什么帮助?我希望有某种方式,说“当所有 HttpContext 都消失了,意思是,当没有更多的请求被处理时,请关闭”?