在 ASP.NET Core 应用程序启动时运行代码的 3 种方法

2023-11-16

开发人员应该将初始化内存缓存的代码放在哪里?

开发人员可能会发现有必要在 ASP.NET Core 应用程序启动时只执行一次代码。例如,开发人员可能需要填充内存缓存、运行后台任务、从某些外部源读取配置、发布应用程序成功启动的事件等。

ASP.NET Core 为开发人员提供了几种不同的方式来实现这一目标,但它们并不等同,开发人员在做出最终选择之前应仔细分析。

直接从ProgramStartup运行代码

在应用程序启动时只执行一次代码的最明显和最直接的方法可能是将该代码直接放入 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 接口,该接口具有在应用程序启动和停止时执行的 StartAsyncStopAsync 方法。此接口通常用于触发长时间运行的后台任务,但 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、ApplicationStoppingApplicationStopped 事件:

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 请求之前,所有类型的启动任务都可以直接从 ProgramStartup 类执行。
  • 长时间运行的后台任务应该由托管服务启动和停止。
  • 开发者可以使用 IHostApplicationLifetime 接口订阅 OnStarted事件,该事件在应用宿主完全配置并启动后发布。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.NET Core 应用程序启动时运行代码的 3 种方法 的相关文章

  • .NET Core代码保护!.NET Reactor这些保护机制你不得不知道!

    NET Reactor是一个功能强大的代码保护和软件许可系统 适用于为 NET Framework编写的软件 并支持生成 NET程序集的所有语言 NET Reactor迎来了久违的版本更新 进入v6 3 0 0全新时代 支持Blazor保护
  • 使用Canvas扩展绘制动态ASP.NET Core Blazor气泡图

    目录 介绍 背景 使用代码 步骤1 创建ASP NET Core Blazor服务器应用程序 运行测试应用程序 步骤2 安装软件包 步骤3 创建模型类 创建服务类 步骤4 将服务添加到Startup cs中 步骤5 使用客户端项目 添加Ra
  • .net core 集成Redis

    第一步 引用StackExchange Redis 第二步 初始化 private string constr 127 0 0 1 6379 allowadmin true connect ConnectionMultiplexer Con
  • VSCode中ASP.NET Core程序添加NuGet引用

    上一篇文章中 创建项目后基本没有改动项目内容 仅是把Pages Index cshtml文件中的Welcome修改为Hello World 复杂的程序需要在项目中引用相关的程序集 在VSCode中引用程序集不像在VS中那么方便 而且最新的项
  • 函数式,F#都做了哪些优化?

    非函数式语言中使用函数式风格的缺点 函数式的优点 想必大家都已经非常了解了 我们来看看 一般语言使用函数式风格可能带来的问题 变量默认是可变的 为了实现不可变性 开发者只能人为的规范不去改变变量的值 没有明确的变量修改提示 容易因失误改变变
  • C# 如何向String[]字符数组插入数据

    C 如何向String 字符数组插入数据 思路 了解 由于数组是非动态的 不能进行动态的添加 思路 首先将string 字符数组转换成list 第二给list添加数据 最后把list转换成string 数组 String arrs new
  • 手把手教你搭建使用NuGet私有源

    文章目录 前言 Who 什么是NuGet Why 为什么用NuGet How 怎么使用NuGet 搭建Nuget私有源 打包Nuget包 发布到私有源 不开启密钥验证 开启密钥验证 测试 总结 前言 相信写过 net的小伙伴应该都用过NuG
  • WTM asp.net core应用程序在Ubuntu上和CentOS上部署

    wtm在Ubuntu上和CentOS上部署 项目发布 在Visual Studio中右击Web项目 选择发布 如下图 Ubuntu安装 net core运行时 Ubuntu我是用的Vmware虚拟机 版本是18 04 参考官方文档 如果要开
  • centso7 openssl 报错Verify return code: 20 (unable to get local issuer certificate)

    问题重现 由于centos7 默认的openssl的版本为1 1 0k 本人编译媒体服务时 需要openssl版本1 1 1以上 所有删除的之前的低版本openssl 手动编译了一个1 1 1k的版本 媒体服务正常运行 并且CA验证正常 结
  • mysql和c#在类型转换的问题

    1 char 36 和string mysql在将char 36 类型的会转成System GUID 如果char 36 字段里存的不是guid 最好不要用char 36 改成char 37 这样的就没事了 在 net开放中 asp net
  • abp web.mvc项目中的菜单加载机制

    abp中的菜单加载机制 在abp中菜单的定义与我们传统写的框架不一样 它是在编写代码的时候配置 而我们一般写的通用权限管理系统中 是后期在后台界面中添加的 这一点有很大不同 abp关于菜单的定义及管理挺复杂的 与菜单相关的结构类 接口及扩展
  • 配置IIS Express局域网访问 VS2017调试.Net Core

    局域网配置参考https blog csdn net yeluo vinager article details 84305111 注意 当出现这个问题 注意将VS关闭 重新以管理员身份打开就可以了
  • .net 中context、DbContext是什么?

    可以将上下文看作相关 事物 的包装 例如 HttpContext DbContext ObjectContext HttpContext包含任何HTTP相关操作的信息 DbContext包含用于数据库通信的方法和属性 ObjectConte
  • Net Core API跨域的处理 vs2017

    Startup ConfigureServices public void ConfigureServices IServiceCollection services services AddCors options gt options
  • .net core 连接Mysql

    1 安装依赖包 在这里插入图片描述 https img blog csdnimg cn 16e74e954c414688b26af8b9d92fd793 png x oss process image watermark type d3F5
  • 简单示例中的多平台Avalonia .NET Framework编程基本概念

    目录 介绍 关于Avalonia 本文的目的 本文的组织 示例代码 解释概念 视觉树 Avalonia 工具 逻辑树 附加属性 样式属性 直接属性 有关附加 样式和直接属性的更多信息 绑定 什么是Avalonia UI和WPF中的绑定以及为
  • 关于ASP.NET MVC与.NET CORE 的区别--小结

    简述关于ASP NET MVC与 NET CORE的区别 1 关于ASP NET 关于MVC 刚开始接触这个技术的时候我经常不理解他们的名字 我相信许多学ASP NET开发人员开始接触MVC应该也和我一样产生很多为什么 也会误认为认为MVC
  • .NET Core 获取自定义配置文件信息

    官方文档说 引用 Microsoft AspNetCore App 元包或将包引用添加到 Microsoft Extensions Options ConfigurationExtensions 包 简而言之 直接可以获取 不用引用包了 a
  • 已启用Azure Arc的Kubernetes第2部分:添加安全性和监视

    目录 设置Microsoft Defender for Clound 启用Microsoft Defender 安装Microsoft Defender for Kubernetes Cluster Extension 设置Azure Mo
  • Nacos 单机模式部署(Windows系统)

    Nacos 下载地址 Nacos 是阿里巴巴推出来的一个项目 这是一个更易于构建云原生应用的动态服务发现 配置管理和服务管理平台 Nacos 致力于帮助您发现 配置和管理微服务 Nacos 提供了一组简单易用的特性集 帮助您快速实现动态服务

随机推荐

  • linux如何查看入口地址,宝塔Linux面板安全入口地址忘了(方法一)

    宝塔Linux面板安全入口地址忘了 方法一 面板 地址 入口 宝塔 所示 宝塔Linux面板安全入口地址忘了 方法一 易采站长站 站长之家为您整理了宝塔Linux面板安全入口地址忘了 方法一 的相关内容 现在新安装的宝塔 Linux 面板时
  • win10-未知的USB设备-解决自己问题的记录

    若是没有解决你的问题 再找找其他办法看看 我也是网上搜的 刚好解决了我的问题我就记录了一下而已 哈哈哈 原文链接 修复 未知的USB设备 设备描述符请求失败 在Windows 10中 1 设备管理器 gt 通用串行总线控制器 gt 未知US
  • 基于opencv的手势识别

    大家好 我是一名本科生 我的主要学习方向是计算机视觉以及人工智能 按照目前的学习进度来说 我就是一小白 在这里写下自己编写的程序 与大家分享 记录一下自己的成长 今天与大家分享的是基于OpenCv的手势识别 思路分析 获取图片 在图片中找到
  • unity添加多个相机渲染物体多个视角的图片

    添加相机 我渲染物体多视角的图片是要用到cave空间 所以添加了四个相机 并且都放在空物体下面 还有两个物体 用在cave空间要保证四个相机的位置一致 rotation互成90 前 0 0 0 右 0 90 0 左 0 270 0 下 90
  • 用matplotlib动画功能,一帧一帧的录制排序算法

    1 matplotlib绘制动画 matplotlib是python中最经典的绘图包 里面animation模块能绘制动画 首先导入小例子使用的模块 from matplotlib import pyplot as plt from mat
  • 高性能MySQL:创建高性能索引

    文章目录 前言 一 索引的语法 1 1 创建索引 1 2 删除索引 1 3 查看索引 1 4 查看查询语句使用索引的情况 二 索引的优缺点 2 1 索引的优点 2 2 索引的缺点 三 索引的类型 3 1 按照功能逻辑区分 3 2 按照数据结
  • BH1750简单介绍

    bh1750是16位数字输出型 环境光强度传感器集成电路 主要应用有移动电话 液晶电视 笔记本电脑 便携式游戏机 数码相机 数码摄像机 汽车定位系统 液晶显示器 目录 1 bh1750中文资料 2 bh1750引脚说明 3 bh1750传感
  • 算法入门 24. TSP问题(状态压缩DP)

    TSP问题 问题描述如下 假设有一个旅行商人要拜访n个城市 他必须选择所要走的路径 路径的限制是每个城市只能拜访一次 而且最后要回到原来出发的城市 路径的选择目标是要求得的路径路程为所有路径之中的最小值 include
  • warning: #940-D: missing return statement at end of non-void function “fgetc“解决方案

    问题描述 warning 940 D missing return statement at end of non void function fgetc 解决方案 解决措施 引入头文件stdio h
  • 前端面试知识点整理——项目整理

    前端面试知识点整理 项目整理 文章目录 一 华工线上黑市 安卓 二 二手闲置商场 健身管理系统 小程序 三 birthday app swift 四 给Joey的生日页面 移动端 五 开发者博客 vue 一 华工线上黑市 安卓 1 MVP架
  • npm install 离线安装

    将外网装好的npm 将其缓存拷到内网 再通过缓存文件安装 注意内外网的nodejs npm版本要一致 不一致要 将其卸载 重装成一致的 卸载时 看 usr local lib usr local include usr local bin
  • HardFault_Handler问题查找方法

    一 程序进入HardFault Handler 可能原因 1 内存溢出 常见的于数组访问越界 2 堆栈溢出 堆栈设置过小等 二 排查方法 方法1 出现该情况后 可首先查看LR寄存器中的值 确定当前使用堆栈为MSP或PSP 1 打开寄存器窗口
  • asm:常用语法

    常用语法 1 循环 1 1 使用条件跳转指令实现循环 1 2 使用LOOP指令实现循环 2 字符串 2 1 指定字符串的长度 2 2 字符串指令 2 3 重复前缀 3 数组 4 递归 5 宏 6 文件操作 7 内存管理 1 循环 1 1 使
  • 2023年美赛五大热点问题(赛前准备、报名、选题、评审、查询)全面解读!

    思路 永久更新 全网最新最全 持续更新中 查看最下方QQ群获取 2023年美赛五大热点问题全面解读 赛前准备 报名 选题 评审 查询 一 赛前准备 硬实力准备 1 学习常用模型 算法 并进行实战建模练习 学习常用模型的原理 并分别进行应用练
  • 应用层——域名系统DNS

    认识DNS 我们平常在访问某个网站的时候不使用IP地址 而是使用一串有罗马字和点号组成的字符串 而一般用户在使用TCP IP进行通信的时候也不实用IP地址 能够这样做是因为有了DNS Domain Name System 功能的支持 DNS
  • 在Ubuntu 18.04 中设置开机自动执行脚本

    Ubuntu18 04 不能像16 04 那样可以直接使用 etc rc local 文件 需要设置 1 建立 rc local service 文件 sudo vim etc systemd system rc local service
  • 【Vue2.0源码学习】实例方法篇-生命周期相关方法

    文章目录 0 前言 1 vm mount 1 1 用法回顾 1 2 内部原理 2 vm forceUpdate 2 1 用法回顾 2 2 内部原理 3 vm nextTick 3 1 用法回顾 3 2 JS的运行机制 3 3 内部原理 能力
  • 时空猎人服务器维护中是什么意思,时空猎人玩家自助FAQ问题汇总新手必备

    玩家自助FAQ问题汇总新手必备 你总能碰到各种各样的游戏问题 或机型问题 这里整理了一个常见问题解决办法 FAQ 可以帮忙大家 一 运行时程序异常退出建议玩家按照以下方式处理 1 清理缓存 关闭空闲软件 再次登录游戏 2 如果问题反复出现建
  • java8_02_stream(一)创建流和中间操作

    Stream 主要分为三部分 1 创建流 2 中间操作 3 终止操作 一 创建流的四种方法 Collection系列集合的stream parallelStream 方法 Stream stringStream list stream Ar
  • 在 ASP.NET Core 应用程序启动时运行代码的 3 种方法

    开发人员应该将初始化内存缓存的代码放在哪里 开发人员可能会发现有必要在 ASP NET Core 应用程序启动时只执行一次代码 例如 开发人员可能需要填充内存缓存 运行后台任务 从某些外部源读取配置 发布应用程序成功启动的事件等 ASP N