理解 ASP.NET Core: 实现 Application_Start 和 Application_End

在 ASP.NET 中两个常用的处理节点是 Application_Start() 和 Application_End(),它是在第一个请求到达网站的时候被执行和网站停止服务的时候被执行。通常用来进行网站的初始化处理和网站的扫尾处理。

在 ASP.NET Core 中没有了默认的请求处理管道,也没有了 Global.asax,怎样处理这两个事件呢?

在中间件中并不方便处理,中间件将在每个请求到达服务器的时候处理。

这需要通过 ASP.NET Core 的应用程序生命周期来管理。

在 ASP.NET Core 中,网站作为 Host 中寄宿的一个服务,服务使用一个生命周期管理对象 IApplicationLifetime 暴露其生命周期。该对象提供了 3 个重要的事件。我们可以在需要的事件上注册回调函数。

 /// <summary>
/// Triggered when the application host has fully started and is about to wait
/// for a graceful shutdown.
/// </summary>
CancellationToken ApplicationStarted { get; } /// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// Requests may still be in flight. Shutdown will block until this event completes.
/// </summary>
CancellationToken ApplicationStopping { get; } /// <summary>
/// Triggered when the application host is performing a graceful shutdown.
/// All requests should be complete at this point. Shutdown will block
/// until this event completes.
/// </summary>
CancellationToken ApplicationStopped { get; }

在 GitHub 中查看 IApplicationLifetime 源码

IApplicationLifetime 同样可以通过注入而使用,例如,我们可以在 Configure() 方法中注入并使用该对象。

public void Configure(IApplicationBuilder app,
Microsoft.Extensions.Hosting.IHostApplicationLifetime applicationLifetime,
ILoggerFactory loggerFactory)
{
// use applicationLifetime
}

使用注入的对象注册,这里注册了服务停止事件。

public class Startup
{
private ILogger _logger; public void Configure(
IApplicationBuilder app,
Microsoft.Extensions.Hosting.IHostApplicationLifetime applicationLifetime,
ILoggerFactory loggerFactory)
{
applicationLifetime.ApplicationStarted.Register(OnStartup);
applicationLifetime.ApplicationStopping.Register(OnShutdown);
...
// add logger providers
// loggerFactory.AddConsole()
...
_logger = loggerFactory.CreateLogger("StartupLogger");
} private void OnStartup()
{ } private void OnShutdown()
{
// use _logger here;
}
}

见:https://stackoverflow.com/questions/41675577/where-can-i-log-an-asp-net-core-apps-start-stop-error-events

需要注意的是,这里的事件没有使用 EventHandler,而是使用了 CancellationToken,原因是 CancellationToken 支持在多线程情况下使用。

实现 Application_Start 和 Application_End的更多相关文章

  1. Application_Start和Application_End事件执行时间

    Application_start: 第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计,历史访问人数统计的初始化等等均可在这里定义. Applicatio ...

  2. SpringMVC中如何在网站启动、结束时执行代码(详细,确保可用)

        在一个网站启动.结束时,我们经常有些操作是需要执行的. 熟悉Asp.net的朋友,使用Global.asax很容易就搞定,在其中有Application_Start和Application_E ...

  3. 实时数据显示--SignalR实例演示

    近段时间,有实现一个看板的功能,就是用户更新信息时,即是对数据库的数据进行插入,更新,或是删除时,在墙上的屏幕的数据不需要人为去刷新,用户就能看到更新后的数据. 实现此功能,Insus.NET使用Si ...

  4. When using SqlDependency without providing an options value, SqlDependency.Start() must be called prior to execution of a command added to the SqlDependency instance.

    在调试SignalR程序时,提示一个异常:When using SqlDependency without providing an options value, SqlDependency.Star ...

  5. ASP.NET Global.asax详解

    最近在研究bbsmax的代码,但是一直不知道入口在哪里,然后就对各个文件分析了,然后终于在对global.asax文件查看的时候看到Application_BeginRequest才明白入口,所以现在 ...

  6. Asp.Net(C#)自动执行计划任务的程序实例分析

    在业务复杂的应用程序中,有时候会要求一个或者多个任务在一定的时间或者一定的时间间隔内计划进行,比如定时备份或同步数据库,定时发送电子邮件等,我们称之为计划任务.实现计划任务的方法也有很多,可以采用SQ ...

  7. 关于ASP.NET与CLR相互关系的一些总结

    原文地址:http://www.cnblogs.com/jasenkin/archive/2010/10/20/asp-net-clr-relation.html CLR(COM服务器) CLR作为一 ...

  8. ASP.NET页面与IIS底层交互和工作原理详解

    转载自:http://www.cnblogs.com/lidabo/archive/2012/03/13/2393200.html 第一回: 引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是 ...

  9. HttpModule和Http Handler (比较与区别)

    HttpModule和Http Handler (比较与区别) HttpModule概述 暂时先不考虑我们自己实现Http Module的情况.在.Net中,Http Module 是实现了IHttp ...

随机推荐

  1. 专攻知识小点——回顾JavaWeb中的servlet(三)

    HttpSession基本概述 ** ** 1.HttpSession:是服务器端的技术.和Cookie一样也是服务器和客户端的会话.获得该对象是通过HTTPServletRequest的方法getS ...

  2. SpringBoot连接多数据源(HBASE,KUDU,ORACLE集成和开发库)

    前提:1.连接hadoop需要本地安装 winutils.exe 并在程序指定,不然程序会报错  IOException: HADOOP_HOME or hadoop.home.dir are not ...

  3. Java学习的第三十二天

    1. 2.综合例题没太看懂 3.明天复习第十二章

  4. 基于uni-app的微信小程序之分包

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 0. 缘由 1. 关于分包 1.0 这是 官方文档 1.1 注意事项 2.使用方法 2.1 首先你得有个uniapp的微信小程序项目 2.2 ...

  5. MIT 6.S081 Lab5 Copy-On-Write Fork

    前言 最近绝大多数的空闲时间都拿来锤15-445了,很久没动6.S081.前几天回头看了一下一个月前锤完的Lazy Allocation,自己写的代码几乎都不认识了.......看来总结之类的东西最好 ...

  6. python 学习小记之冒泡排序

    lst =[11,22,44,2,1,5,7,8,3] for i in range(len(lst)):     i = 0     while i < len(lst)-1:         ...

  7. 剑指offer之打印超过数组一半的数字

    问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  8. js 操作css

    类似于jquery的css()函数,js封装 CSS函数:css(oDiv , "width" , "200px ")设置样式css(oDiv , " ...

  9. 18FlaskRESTful

    一,虚拟环境下安装(win) 在安装这个环节发现了很多问题,pycharm里装了之后发现根本引用不了,查明原因是因为第三方库pycharm无法识别. 解决办法:进入虚拟环境直接pip. 二,基本使用 ...

  10. 【转】Lisp的本质

    Lisp的本质: http://www.csdn.net/article/2012-11-22/2812113-The-Nature-Of-Lisp###