专栏首页汪宇杰博客编程方式重启 ASP.NET Core 网站

编程方式重启 ASP.NET Core 网站

常言道,多喝热水,重启试试。有时候当应用工作不正常,重启也许能解决问题。但是程序员通常接触不到服务器系统权限。而运维人员和公司流程经常人为制造麻烦阻止我们去重启应用。老实的程序员不善言辞交际,只能放弃重启,干看代码,加班猝死。其实,我们可以在代码里给自己留一个重启应用的方法,教教他们别惹程序员的道理。

IApplicationLifetime

ASP.NET Core 有个很牛逼的接口,叫做IApplicationLifetime。它能用来处理网站启动后,以及停止网站的任务。

这个接口提供了3个Cancellation Token,允许安排Action委托来处理应用启动和关闭的事件:

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:

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网站:

[HttpGet("blow-me-up")]
public IActionResult BlowMeUp()
{
 applicationLifetime.StopApplication();
    return new EmptyResult();
}

现在,只要访问 blow-me-up 这个URL,网站就会自杀:

并且我们能看到正确的日志输出

重新启动ASP.NET Core网站特别简单,在IIS等host环境下,只要发一个新的request就能自动重启!也就是重新访问一下我们的网站即可~

今天就介绍这些内容。祝大家编程快乐,遇到问题先喝热水再重启,一定能解决 :)

本文分享自微信公众号 - 汪宇杰博客(ediwangblog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 万能工具,完全免费实现各种超实用功能

    电脑已经成为了我们生活和工作的一部分,现在绝大部分人的工作都离不开电脑。当然,学习也离不开电脑,特别是我们大学生要常常在电脑上下载一些学习资料或者论文,就更离不...

    夏末浅笑
  • ui5 resource file 404 error

    所有前缀为mymap的resource 的relative url都设置为从./mymap出发,而不是resources/

    Jerry Wang
  • where is count server execution interval configured

    在Chrome network tab里能观察到周期性的Odata call:

    Jerry Wang
  • 小型企业如何选择腾讯云服务器

    https://cloud.tencent.com/redirect.php?redirect=1042&cps_key=6f5f5aedea72d213ca3...

    勤劳的小蜜蜂
  • CSS自定义属性级联变量var()

    https://www.cnblogs.com/bibibobo/p/6140659.html http://www.ruanyifeng.com/blog/...

    mafeifan
  • 从三流小公司到一线大厂,聊聊程序员的成长之道

    我想,没有一个程序员能够一步登天,一下子达到很高的高度,有些路是我们必须要走的,有些阶段是我们必须要经历的。有入门,才有进阶,才有更上一层楼。

    黄小斜
  • 在Excel中获得汉字的首字母

    Function hztopy(hzpy As String) As String

    钱塘小甲子
  • 2019年6月份腾讯云优惠券、代金券、云产品内购价格

    https://cloud.tencent.com/redirect.php?redirect=1042&cps_key=6f5f5aedea72d213ca3...

    勤劳的小蜜蜂
  • 9-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)(微信配网配置_开发者基本配置_2)

    https://www.cnblogs.com/yangfengwu/p/11062422.html

    杨奉武
  • 2019腾讯云服务器企业应用最佳配置方案

    https://cloud.tencent.com/redirect.php?redirect=1042&cps_key=6f5f5aedea72d213ca3...

    勤劳的小蜜蜂

扫码关注云+社区

领取腾讯云代金券