当前位置:网站首页>在 ASP.NET Core 应用程序启动时运行代码的 3 种方法
在 ASP.NET Core 应用程序启动时运行代码的 3 种方法
2022-07-31 05:43:00 【风神修罗使】
开发人员应该将初始化内存缓存的代码放在哪里?
开发人员可能会发现有必要在 ASP.NET Core 应用程序启动时只执行一次代码。例如,开发人员可能需要填充内存缓存、运行后台任务、从某些外部源读取配置、发布应用程序成功启动的事件等。
ASP.NET Core 为开发人员提供了几种不同的方式来实现这一目标,但它们并不等同,开发人员在做出最终选择之前应仔细分析。
直接从Program
或Startup
运行代码
在应用程序启动时只执行一次代码的最明显和最直接的方法可能是将该代码直接放入 Program
类的 Main
方法或 Startup
类的 Configure
方法中。 ASP.NET Core 确保这些方法以及放置在其中的代码仅在应用程序启动时执行。
//"Main" method
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
//Startup logic here
host.Run();
}
//"Configure" method
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
//...
//Startup logic here
}
开发人员可以根据具体情况选择两种方式之一来放置启动逻辑。例如,如果启动逻辑只应在配置请求处理管道后运行,则开发人员应将其放在 Configure
方法的末尾,而不是在创建 IHost
对象之后。
将逻辑放在 Main(或在极少数情况下的 Configure
方法)中的主要优点是可以在应用程序开始服务 Web 请求之前执行启动逻辑,这对于初始化内存缓存或读取配置等任务很重要。
从托管服务运行代码
ASP.NET Core 为开发人员提供了一个 IHostedService
接口,该接口具有在应用程序启动和停止时执行的 StartAsync
和 StopAsync
方法。此接口通常用于触发长时间运行的后台任务,但 StartAsync
本身必须快速返回,以免阻塞其他托管服务(如果有)。
//Define your hosted service with startup logic
public class MyHostedService : IHostedService
{
public async Task StartAsync(CancellationToken cancellationToken)
{
//Startup logic here
}
public async Task StopAsync(CancellationToken cancellationToken)
{
//Cleanup logic here
}
}
//Register hosted service
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<MyHostedService>();
}
此外,最好知道 StartAsync
方法在配置应用程序的请求管道之前运行(在执行 Configure
方法之前)。当启动逻辑仅在应用程序的请求管道配置后才需要运行时,这可能是一个问题。
订阅 IHostApplicationLifetime
事件
另一个 ASP.NET Core 接口 IHostApplicationLifetime
允许开发人员将其处理程序订阅到 ApplicationStarted、ApplicationStopping
和 ApplicationStopped
事件:
public void Configure(
IApplicationBuilder app,
IWebHostEnvironment env,
IHostApplicationLifetime appLifetime)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//...
appLifetime.ApplicationStarted.Register(OnStarted);
appLifetime.ApplicationStopping.Register(OnStopping);
appLifetime.ApplicationStopped.Register(OnStopped);
}
private void OnStarted()
{
//"On-started" logic
}
private void OnStopping()
{
//"On-stopping" logic
}
private void OnStopped()
{
//"On-stopped" logic
}
需要注意的是,OnStarted
事件仅在应用程序主机完全启动后发布,即在服务和请求处理管道已配置并且应用程序已开始服务 Web 请求之后。这意味着如果需要在应用程序开始服务 Web 请求之前执行某些启动逻辑,则生命周期事件将不是一个选择。
总结
- 在应用程序开始服务 Web 请求之前,所有类型的启动任务都可以直接从
Program
或Startup
类执行。 - 长时间运行的后台任务应该由托管服务启动和停止。
- 开发者可以使用
IHostApplicationLifetime
接口订阅OnStarted
事件,该事件在应用宿主完全配置并启动后发布。
边栏推荐
- 常用命令讲解
- DirectExchange交换机简单入门demo
- Analysis of the implementation principle and detailed knowledge of v-model syntactic sugar and how to make the components you develop support v-model
- 基本正则表达式元字符,字符,次数,锚定分组
- 2022.7.29 数组
- 测试 思维导图
- Install and use uView
- TCP/IP协议和互联网协议群
- Shell编程规范与变量
- CHI论文阅读(1)EmoGlass: an End-to-End AI-Enabled Wearable Platform for Enhancing Self-Awareness of Emoti
猜你喜欢
芯塔电子斩获第十一届中国双创大赛芜湖赛区桂冠
外贸网站优化-外贸网站优化教程-外贸网站优化软件
树状数组(单点修改区间查询和区间修改单点查询)
Zero-Shot Learning & Domain-aware Visual Bias Eliminating for Generalized Zero-Shot Learning
银河麒麟高级服务器v10 sp1 手动加载Raid卡驱动
Analysis of the implementation principle and detailed knowledge of v-model syntactic sugar and how to make the components you develop support v-model
OSI七层模型
高并发与多线程之间的难点对比(容易混淆)
Some derivation formulas for machine learning backpropagation
引导过程和服务控制
随机推荐
如何在uni-app中选择一个合适的UI组件库
JS函数柯里化
批量翻译软件免费【2022最新版】
编辑时过滤当前节点及根据限制的层数过滤数据
MySQL系列一:账号管理与引擎
R——避免使用 col=0
Analysis of the implementation principle and detailed knowledge of v-model syntactic sugar and how to make the components you develop support v-model
Shell编程规范与变量
外贸网站优化-外贸网站优化教程-外贸网站优化软件
浅析重复线性渐变repeating-linear-gradient如何使用
How to choose a suitable UI component library in uni-app
零样本学习&Domain-aware Visual Bias Eliminating for Generalized Zero-Shot Learning
shell脚本 -d 是目录文件,那么-e,-f等说明
磁盘管理与文件系统
tidyverse笔记——tidyr包
shell之条件语句(test、if、case)
DDL+DML+DQL
Hook API
Chapter 16: Constructing the Magic Square for Prime Numbers of Order n(5,7)
一文读懂 MongoDB 和 MySQL 的差异