前言

本文主要讲的是Asp.Net Core的启动过程,帮助大家掌握应用程序的关键配置点。

1、创建项目

1.1、用Visual Studio 2019 创建WebApi项目。

这里面可以看到有两个关键的类。 一个Program,一个stsrtup

Program里面有一个Main函数,Main函数里面会调用我们的CreateHosbuilder这个方法,CreateHosbuilder里面返回了一个IHostBuilder,那么IHostBuilder就是我们应用程序启动的核心接口

1.2、我们转到定义看一下IHostBuilder这个接口的定义

这个接口主要有6个方法这里面我们需要关注的是:ConfigureAppConfiguration、ConfigureHostConfiguration、和ConfigureServices

为了演示整个应用程序的启动过程我们回到Program,修改CreateHostBuilder 在里面添加一些代码,把方法名打印出来

 public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
//委托入参是:IConfigurationBuilder
.ConfigureAppConfiguration(builder =>
{
Console.WriteLine("ConfigureAppConfiguration");
})
//入参 IServiceCollection
.ConfigureServices(services =>
{
Console.WriteLine("ConfigureServices");
})
//入参IConfigurationBuilder
.ConfigureHostConfiguration(builder =>
{
Console.WriteLine("ConfigureHostConfiguration");
})
//入参 IWebHostBuilder
.ConfigureWebHostDefaults(webBuilder =>
{
Console.WriteLine("ConfigureWebHostDefaults");
webBuilder.UseStartup<Startup>();
});
}

Starup里面的主要有三个方法 构造行数、ConfigureServices、Configure 同样的打印出来

public class Startup
{
public Startup(IConfiguration configuration)
{
Console.WriteLine("Startup构造函数");
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
Console.WriteLine("Startup.ConfigureServices"); services.AddControllers();
} public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
Console.WriteLine("Startup.Configure");
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}

启动应用程序看看,顺序我标注在下面了,Starup里面的是按顺序启动的

如果应用程序启动起来没有输出控制台的修改一下启动  选择项目名称 不要选择IIS 我在次研究了半天哈哈

修改一下里面顺序看看,可以发现执行的顺序与之前略微不同,就是ConfigureService这一行跑到了Startup.ConfigureServices之后。

2、结论

这些委托注册进去之后都是按一定顺序来执行的

整个启动过程分为5个阶段:

2.1、ConfigureWebHostDefaults

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

2.2、ConfigureHostConfiguration

它是用来配置我们应用程序启动时必要的配置。比如说我们应用程序启动时所需要的监听的端口、我们需要监听的Url地址这些。在这个过程我们可以嵌入一些我们自己的配置内容注入到我们的配置的框架中去

2.3、ConfigureAppConfiguration

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

2.4、ConfigureServices、ConfigureLogging、Startup、Startup.ConfigureServices

这些的话都是用来往容器里面注入我们的应用的组件

2.5、Startup.Configure

是我们用来注入我们的中间件,处理HttpContext整个请求过程的

3、Startup类非必要

Startup这个类其实不是必要的,在Progarm里面也可以配置,

 public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
//入参 IWebHostBuilder
.ConfigureWebHostDefaults(webBuilder =>
{
Console.WriteLine("ConfigureWebHostDefaults");
// webBuilder.UseStartup<Startup>();
webBuilder.ConfigureServices(services =>//对等Startup里面的Startup.ConfigureServices
{
services.AddControllers();
})
.Configure(app =>// 对等Startup里面的Startup.Configure
{
//if (env.IsDevelopment())
//{
// app.UseDeveloperExceptionPage();
//} app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
});
})
//入参 IServiceCollection
.ConfigureServices(services =>
{
Console.WriteLine("ConfigureServices");
})
//委托入参是:IConfigurationBuilder
.ConfigureAppConfiguration(builder =>
{
Console.WriteLine("ConfigureAppConfiguration");
}) //入参IConfigurationBuilder
.ConfigureHostConfiguration(builder =>
{
Console.WriteLine("ConfigureHostConfiguration");
}) ;

这样应用程序一样的可以启动起来 这只是为了规范建议还是留着哈哈

记得添加命名空间

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

参考视频链接:https://time.geekbang.org/course/intro/272?code=PuP-H4FsFaRyMFC-qRHJndCmpGGNZ64zelNHZOYI1R8%3D

原文地址 https://www.cnblogs.com/w5942066/p/12803556.html

Asp.Net Core 3.1 的启动过程5的更多相关文章

  1. asp.net core mvc剖析:启动流程

    asp.net core mvc是微软开源的跨平台的mvc框架,首先它跟原有的MVC相比,最大的不同就是跨平台,然后又增加了一些非常实用的新功能,比如taghelper,viewcomponent,D ...

  2. ASP.NET Core管道详解[6]: ASP.NET Core应用是如何启动的?[下篇]

    要承载一个ASP.NET Core应用,只需要将GenericWebHostService服务注册到承载系统中即可.但GenericWebHostService服务具有针对其他一系列服务的依赖,所以在 ...

  3. 解决ASP.NET Core通过docker-compose up启动应用无法配置https的解决办法

    错误重现一下: 新建了一个ASP.NET Core应用,在VS2017下添加Docker支持,选择Linux环境 然后再给这个web应用再右键添加容器业务流程协调程序支持,然后解决方案就多了一个doc ...

  4. [08]ASP.NET Core 中 launchsettings.json 启动配置文件

    ASP.NET Core launchsettings.json 启动配置文件 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新版本 本文出自 ...

  5. ASP.NET Core使用HostingStartup增强启动操作

    概念 在ASP.NET Core中我们可以使用一种机制来增强启动时的操作,它就是HostingStartup.如何叫"增强"操作,相信了解过AOP概念的同学应该都非常的熟悉.我们常 ...

  6. 在ASP.NET Core中使用托管启动(hosting startup)程序集,实现批量注册service

    在启动ASPNET Core时可以从外部程序集向应用添加增强功能.例如,外部库可以用托管启动( hosting startup) 实现为应用程序提供附加配置(Configuration)或服务(ser ...

  7. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  8. 如何在ASP.NET Core程序启动时运行异步任务(1)

    原文:Running async tasks on app startup in ASP.NET Core (Part 1) 作者:Andrew Lock 译者:Lamond Lu 背景 当我们做项目 ...

  9. 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志

    前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...

随机推荐

  1. Vue.js系列(一):Vue项目创建详解

    引言 Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式.本文旨在帮助大家认识Vue.js,并详细介绍使用vue-cli脚手架工具快速的构建Vu ...

  2. [noip模拟]种花<快速幂+结论>

    描述: OI太可怕了,我决定回家种田.我在后院里开辟了一块圆形的花圃,准备种花.种花是一种艺术,通过一定技术手法,花材的排列组合会让花变得更加的赏心悦目,这就是花艺.当然你知道,我在种田之前是OIer ...

  3. [vijos1304]回文数<模拟>

    题目链接:https://vijos.org/p/1304 好久没写博客了,最近一直打不出题,感觉自己是废了,今天做了一道模拟水题,但还是半天没过,后来才发现是忘记考虐10以上的进制是带有字母的,然后 ...

  4. Spring装配Bean的三种方式+导入和混合配置

    目录 Spring IoC与bean 基于XML的显式装配 xml配置的基本结构 bean实例的三种创建方式 依赖注入的两种方式 构造器注入方式 setter方法注入方式 利用命名空间简化xml 基于 ...

  5. captcha-killer burp验证码识别插件体验

    0x01 使用背景 在渗透测试和src挖洞碰到验证码不可绕过时,就会需要对存在验证码的登录表单进行爆破,以前一直使用PKav HTTP Fuzzer和伏羲验证码识别来爆破,但是两者都有缺点PKav H ...

  6. 感染(low)bfs 、感染(mid) 二分、感染(high) 二分 + 维护单调 队列去除无用的点

    感染(low) Description n户人家住在一条直线上,从左往右依次编号为1,2,-,n.起初,有m户人家感染了COVID-19,而接下来的每天感染的人家都会感染他家左右两家的人,问t天后总共 ...

  7. 从JDK源码学习Arraylist

    从今天开始从源码去学习一些Java的常用数据结构,打好基础:) Arraylist源码阅读: jdk版本:1.8.0 首先看其构造方法: 构造方法一: 第一种支持初始化容量大小,其中声明一个对象数组, ...

  8. jenkins集成sonarQube实现代码质量检查

    1.sonarQube的简介 SonarQube是一款自动化代码审查工具,用于检测代码中的错误.漏洞和代码异味.它可以与你现有的工作流集成,以支持跨项目分支和拉取请求的连续代码检查. 其工作流程如下: ...

  9. PTA数据结构与算法题目集(中文) 7-8

    PTA数据结构与算法题目集(中文)  7-8 7-8 哈利·波特的考试 (25 分)   哈利·波特要考试了,他需要你的帮助.这门课学的是用魔咒将一种动物变成另一种动物的本事.例如将猫变成老鼠的魔咒是 ...

  10. pip 命令参数以及如何配置国内镜像源

    文章更新于:2020-04-05 注:如果 pip 命令不可以用,参见:python pip命令不能用 文章目录 一.参数详解 1.命令列表 2.通用参数列表 二.实际应用 1.常用命令 2.`pip ...