如何实现 asp.net core 安全优雅退出 ?
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实现 asp.net core 安全优雅退出 ?相关的知识,希望对你有一定的参考价值。
咨询区
AppDeveloper
我想问一个老生常谈的问题,如何可以保证程序优雅的退出,这里用 优雅
的目的是因为我想在退出之前做一些小动作。
用户场景:希望在程序退出之前可以从 Consul
上解注册, 下面是我的模板代码。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((host, config) =>
)
.UseStartup<Service>();
回答区
Edward:
为了能够让程序优雅的退出,你可以用 IHostApplicationLifetime
哈,它定义了很多 action 枚举,比如:启动前,启动后,停止前 等等。。。
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading;
namespace Microsoft.Extensions.Hosting
/// <summary>
/// Allows consumers to be notified of application lifetime events. This interface is not intended to be user-replaceable.
/// </summary>
public interface IHostApplicationLifetime
/// <summary>
/// Triggered when the application host has fully started.
/// </summary>
CancellationToken ApplicationStarted get;
/// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// Shutdown will block until this event completes.
/// </summary>
CancellationToken ApplicationStopping get;
/// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// Shutdown will block until this event completes.
/// </summary>
CancellationToken ApplicationStopped get;
/// <summary>
/// Requests termination of the current application.
/// </summary>
void StopApplication();
接下来就可以在相关枚举上注册事件啦,参考如下代码:
public static void Main(string[] args)
var host = CreateHostBuilder(args).Build();
var life = host.Services.GetRequiredService<IHostApplicationLifetime>();
life.ApplicationStopped.Register(() =>
Console.WriteLine("Application is shut down");
);
host.Run();
点评区
说实话,相见恨晚,我在项目开发中也遇到了这种情况,我的场景是需要将 asp.net core 用 后台服务
的方式承载,为了方便操作,我用了 topshelf
,官方网址:http://topshelf-project.com 类似如下代码:
public class TownCrier
readonly Timer _timer;
public TownCrier()
_timer = new Timer(1000) AutoReset = true;
_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("It is 0 and all is well", DateTime.Now);
public void Start() _timer.Start();
public void Stop() _timer.Stop();
public class Program
public static void Main()
var rc = HostFactory.Run(x => //1
x.Service<TownCrier>(s => //2
s.ConstructUsing(name=> new TownCrier()); //3
s.WhenStarted(tc => tc.Start()); //4
s.WhenStopped(tc => tc.Stop()); //5
);
x.RunAsLocalSystem(); //6
x.SetDescription("Sample Topshelf Host"); //7
x.SetDisplayName("Stuff"); //8
x.SetServiceName("Stuff"); //9
); //10
var exitCode = (int) Convert.ChangeType(rc, rc.GetTypeCode()); //11
Environment.ExitCode = exitCode;
现在看样子不需要了。
以上是关于如何实现 asp.net core 安全优雅退出 ?的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core gRPC 集成 Polly 实现优雅重试
ASP.NET Core gRPC 集成 Polly 实现优雅重试
Asp.Net Core 3 优雅关闭抛出 OperationCanceledException
Redis系列文章总结:ASP.Net Core 中如何借助CSRedis实现一个安全高效的分布式锁