当前位置:网站首页>在 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事件,该事件在应用宿主完全配置并启动后发布。
边栏推荐
猜你喜欢
随机推荐
Foreign trade website optimization - foreign trade website optimization tutorial - foreign trade website optimization software
Bulk free text translation
es6数组/数组对象求并集、交集、差集、去重、排序
How to use repeating-linear-gradient
How to choose a suitable UI component library in uni-app
TypeScript基本类型
MySQL系列一:账号管理与引擎
nohup principle
(border-box) The difference between box model w3c and IE
浅析重复线性渐变repeating-linear-gradient如何使用
Oracle入门 02 - IT软硬件平台及操作系统介绍
Dart入门
线程中断方法
Oracle入门 07 - Linux 操作系统安装配置(REHL 7.x)
What is float?What is document flow?Several ways and principles of clearing floats?What is BFC, how to trigger BFC, the role of BFC
Chapter 16: Constructing the Magic Square for Prime Numbers of Order n(5,7)
LeetCode刷题——摆动序列#376#Medium
服务器硬件及RAID配置实战
LVM和磁盘配额
【云原生】-Docker安装部署分布式数据库 OceanBase









