04 | Startup:掌握ASP.NET Core的启动过程

新建一个 ASP.NET Core Web 应用程序

选择 API

public class Program
{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});
}

在 Program.cs 的 Main 函数中

CreateHostBuilder 方法返回了一个 IHostBuilder

它是应用程序启动的核心接口

IHostBuilder 接口有六个方法:

主要关注以下三个:

  • ConfigureAppConfiguration

  • ConfigureHostConfiguration

  • ConfigureServices

接下来,我们添加一些代码演示整个应用程序的启动过程:

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureAppConfiguration(builder =>{Console.WriteLine("ConfigureAppConfiguration");}).ConfigureServices(service =>{Console.WriteLine("ConfigureServices");}).ConfigureHostConfiguration(builder =>{Console.WriteLine("ConfigureHostConfiguration");}).ConfigureWebHostDefaults(webBuilder =>{Console.WriteLine("ConfigureWebHostDefaults");webBuilder.UseStartup<Startup>();});

接着,在 Startup 的三个方法中添加一些代码

public Startup(IConfiguration configuration)
{Console.WriteLine("Startup");...public void ConfigureServices(IServiceCollection services)
{Console.WriteLine("ConfigureServices");...public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{Console.WriteLine("Configure");...

启动程序查看输出:

ConfigureWebHostDefaults
ConfigureHostConfiguration
ConfigureAppConfiguration
ConfigureServices
Startup
Startup.ConfigureServices
Startup.Configure

调整一下委托的注册顺序

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{Console.WriteLine("ConfigureWebHostDefaults");webBuilder.UseStartup<Startup>();}).ConfigureServices(service =>{Console.WriteLine("ConfigureServices");}).ConfigureAppConfiguration(builder =>{Console.WriteLine("ConfigureAppConfiguration");}).ConfigureHostConfiguration(builder =>{Console.WriteLine("ConfigureHostConfiguration");});

会得到不同的结果

ConfigureWebHostDefaults
ConfigureHostConfiguration
ConfigureAppConfiguration
Startup
Startup.ConfigureServices
ConfigureServices
Startup.Configure

本质上,如果查看源码会发现,委托注册进去之后,实际上是按照一定的顺序来执行的:

1、ConfigureWebHostDefaults

这个阶段注册了应用程序必要的几个组件,比如配置的组件、容器组件

2、ConfigureHostConfiguration

用于配置应用程序启动时必要的配置,比如应用程序启动时所需要监听的端口,URL 地址

在这个过程可以嵌入一些自己配置的内容,注入到配置的框架中

3、ConfigureAppConfiguration

用于嵌入自己的配置文件,供应用程序读取,这些配置将会在后续的应用程序执行过程中间每个组件读取

4、ConfigureServices, ConfigureLogging, Startup, Startup.ConfigureServices

用于往容器里注入应用的组件

5、Startup.Configure

用于注入中间件,处理 HttpContext 整个请求过程

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{Console.WriteLine("Startup.Configure");if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseHttpsRedirection();app.UseRouting();app.UseAuthorization();app.UseFileServer();app.UseWebSockets();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});
}

在整个启动的过程中,Startup 这个类不是必要的,只是让代码结构更加合理

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{Console.WriteLine("ConfigureWebHostDefaults");//webBuilder.UseStartup<Startup>();webBuilder.ConfigureServices(services =>{Console.WriteLine("webBuilder.ConfigureServices");services.AddControllers();});webBuilder.Configure(app =>{Console.WriteLine("webBuilder.Configure");app.UseHttpsRedirection();app.UseRouting();app.UseAuthorization();app.UseFileServer();app.UseWebSockets();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});});}).ConfigureServices(service =>{Console.WriteLine("ConfigureServices");}).ConfigureAppConfiguration(builder =>{Console.WriteLine("ConfigureAppConfiguration");}).ConfigureHostConfiguration(builder =>{Console.WriteLine("ConfigureHostConfiguration");});
}

启动程序查看输出:

ConfigureWebHostDefaults
ConfigureHostConfiguration
ConfigureAppConfiguration
webBuilder.ConfigureServices
ConfigureServices
webBuilder.Configure

服务注册一般放在 Startup 的 ConfigureServices,一般是services.AddXXX

public void ConfigureServices(IServiceCollection services)
{services.AddMvc();services.AddAuthentication();services.AddAuthorization();Console.WriteLine("Startup.ConfigureServices");services.AddControllers();
}

中间件的注册一般放在 Startup 的 Configure

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{Console.WriteLine("Startup.Configure");if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseHttpsRedirection();app.UseRouting();app.UseAuthorization();app.UseFileServer();app.UseWebSockets();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});
}

.NET Core开发实战(第4课:Startup:掌握ASP.NET Core的启动过程)--学习笔记相关推荐

  1. 送福利 | 送书5本《ASP.NET Core项目开发实战入门》带你走进ASP.NET Core开发

    <ASP.NET Core项目开发实战入门>从基础到实际项目开发部署带你走进ASP.NET Core开发. ASP.NET Core项目开发实战入门是基于ASP.NET Core 3.1 ...

  2. .NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(上)

    05 | 依赖注入:良好架构的起点 为什么要使用依赖注入框架 借助依赖注入框架,我们可以轻松管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 ASP.NET Core ...

  3. .NET Core开发实战(定义API的最佳实践)Source Generators版

    前言 极客时间上的<.NET Core开发实战>是一门非常好的课程,作者肖伟宇在第31课(https://time.geekbang.org/course/detail/100044601 ...

  4. 微软ASP.NET 电商网站开发实战 MVC6 +HTML5 +WCF+WebAPI+NoSQL+mongoDB+Redis+Core视频 代码 面试题...

    <微软ASP.NET 电商网站开发实战 MVC6 +HTML5 +WCF+WebAPI+NoSQL+mongoDB+Redis+Core 视频 代码 面试题 >下载网盘:https://y ...

  5. asp向不同的用户发送信息_【asp.net core 系列】 1 带你了解一下asp.net core

    0. 前言 这是一个新的系列,名字是<http://ASP.NET Core 入门到实战>.这个系列主讲http://ASP.NET Core MVC,辅助一些前端的基础知识(能用来实现我 ...

  6. ASP.NET Core 2.0 Web API项目升级到ASP.NET Core 3.0概要笔记

    本文结构 先决条件 升级目标框架(Target Framework)的版本 过时的IHostingEnvironment与IApplicationLifetime对象 Endpoint Routing ...

  7. ASP.NET Core appsettings.json文件(9)《从零开始学ASP.NET CORE MVC》:

    本文出自<从零开始学ASP.NET CORE MVC> 推荐文章:ASP.NET Core launchsettings.json文件 ASP.NET Core appsettings.j ...

  8. 2022年8月10日:使用 ASP.NET Core 为初学者构建 Web 应用程序--使用 ASP.NET Core 创建 Web UI(没看懂需要再看一遍)

    ASP.NET Core 支持使用名为 Razor 的本地模板化引擎创建网页. 本模块介绍了如何使用 Razor 和 ASP.NET Core 创建网页. 简介 通过在首选终端中运行以下命令,确保已安 ...

  9. gram矩阵的性质_第十七课:正交矩阵和GramSchmidt正交化——MIT线性代数课程学习笔记...

    公众号关注  "DL_NLP" 设为 "星标",重磅干货,第一时间送达! ◎ 原创 | 深度学习算法与自然语言处理 ◎ 作者 | 丁坤博 一. 知识概要 这一节 ...

最新文章

  1. 在巨头壁垒下,人工智能细分领域涌现领跑者,这是AI真正的新机遇
  2. 【转】mysql多台服务器数据同步
  3. 职场思想分享001 | 有多种选择才叫有能力
  4. Python中jmespath解析提取json数据
  5. 博弈——通过博弈思想解决的问题(hdu1847,2147)
  6. 程序设计与算法----递归之神奇的口袋
  7. RESTful API 特点
  8. hhvm mysql_Ubuntu 14.10 安装 Nginx + MySQL + HHVM + phpMyAdmin [LNMH]
  9. 城市ai大脑_激发AI研究的大脑五个功能
  10. 使用jQuery播放/暂停 HTML5视频
  11. C语言实现EPSG:4326和EPSG:3857的互转
  12. phpStudy安装框架教程
  13. Word 2016插入公式快捷键
  14. 产品快速迭代需要注意点
  15. 2021.12.18-参加青少年人工智能编程水平(YCL)测试5级C++(良好通过)
  16. DIY手机万能红外遥控器
  17. [疯狂Java]JDBC:事务管理、中间点、批量更新
  18. electron-vue打包后样式变大以及不同分辨率屏幕适配问题
  19. python3视频教学百度云盘_Python3自学基础到入门视频教程[百度云盘]
  20. 主流币仍被摁在地上摩擦,平台币已扬起一场美丽的春梦

热门文章

  1. Andorid Binder进程间通信---总结
  2. SQL 中的unicode字符
  3. xp下设置文件的权限(转)
  4. 项目中的模块剥离成项目_使用MCEBuddy 2从电视录制中剥离广告
  5. python博客访问量_史诗级干货-python爬虫之增加CSDN访问量
  6. commons-lang3:DateUtils
  7. Linux重定向详解
  8. CA周记 - 用 Visual Studio Code 做基于 .NET MAUI 跨平台移动应用开发
  9. WPF 展示视频修改为WriteableBitmap
  10. 为什么中国这么多高薪程序员,开发不出Java, Typescript, Python, Rust, Node.js这些基础设施?...