常言道,多喝热水,重启试试。有时候当应用工作不正常,重启也许能解决问题。但是程序员通常接触不到服务器系统权限。而运维人员和公司流程经常人为制造麻烦阻止我们去重启应用。老实的程序员不善言辞交际,只能放弃重启,干看代码,加班猝死。其实,我们可以在代码里给自己留一个重启应用的方法,教教他们别惹程序员的道理。
IApplicationLifetime
ASP.NET Core 有个很牛逼的接口,叫做IApplicationLifetime。它能用来处理网站启动后,以及停止网站的任务。
这个接口提供了3个Cancellation Token,允许安排Action委托来处理应用启动和关闭的事件:
代码语言:javascript复制public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime appLifetime)
{
appLifetime.ApplicationStarted.Register(() =>
{
_logger.LogInformation("Moonglade started.");
});
appLifetime.ApplicationStopping.Register(() =>
{
_logger.LogInformation("Moonglade is stopping...");
});
appLifetime.ApplicationStopped.Register(() =>
{
_logger.LogInformation("Moonglade stopped.");
});
// ... 其他代码
}
ApplicationStarted 发生在应用启动成功以后,也就是Startup.Configure()方法结束后。
ApplicationStopped 发生在程序正在完成正常退出的时候,所有请求都被处理完成。程序会在处理完这货的Action委托代码以后退出。
ApplicationStopping 发生在程序正在执行退出的过程中,此时还有请求正在被处理。应用程序也会等到这个事件完成后,再退出。
我的例子里,给这3个事件都记了日志,以便观察它们的行为。
让网站自尽
IApplicationLifetime 除了刚才的3个事件,还有一个StopApplication() 方法,可以干掉当前的 ASP.NET Core 应用程序。程序自杀的时候会依次执 ApplicationStopping 和 ApplicationStopped 的代码。正是基于这个,我们才能做到编程方式重启ASP.NET网站。
安排重启动作
最方便的重启网站的方式就是访问一个特定的URL啦。以ASP.NET Core MVC网站为例,我们可以这样玩:
依赖注入
注入一个IApplicationLifetime到Controller里。比如我博客后台的AdminController:
代码语言:javascript复制public class AdminController : MoongladeController
{
IApplicationLifetime applicationLifetime;
public AdminController(MoongladeDbContext context,
ILogger<AdminController> logger,
IOptions<AppSettings> settings,
IConfiguration configuration,
IHttpContextAccessor accessor, IApplicationLifetime appLifetime)
: base(context, logger, settings, configuration, accessor)
{
applicationLifetime = appLifetime;
}
// ...
}
自杀开关
定义一个Action,用来停止当前ASP.NET Core网站:
代码语言:javascript复制[HttpGet("blow-me-up")]
public IActionResult BlowMeUp()
{
applicationLifetime.StopApplication();
return new EmptyResult();
}
现在,只要访问 blow-me-up 这个URL,网站就会自杀:
并且我们能看到正确的日志输出
重新启动ASP.NET Core网站特别简单,在IIS等host环境下,只要发一个新的request就能自动重启!也就是重新访问一下我们的网站即可~
今天就介绍这些内容。祝大家编程快乐,遇到问题先喝热水再重启,一定能解决 :)