ASP.NET CORE系列【七】分析NetCore启动原理
前言
有很久一段时间没更新了,因为工作和家里的问题导致没能坚持,
现在开始会继续每周更新,主要是记录自己所学和一起讨论解决过的问题,一起成长,
为.net圈子添砖加瓦!
介绍
到目前为止应该很多同学已经把项目升级到core了,对于项目结构都已经很熟悉了,今天我们主要讲解Startup.Cs Program.Cs两个文件
分析Core项目的启动原理
Program.Cs

很熟悉Main入口,主要是三个方法CreateWebHostBuilder() Build() Run() 很简单的三个方法,但是他却能够顺利的把整个项目给启动起来
它肯定是在内部封装了很多东西,那它是如何封装的呢 是如何运行的
一.首先我们得学会查看源码
1.https://github.com/aspnet/AspNetCore
2.Vs2019
3.Reshaper
这里有三个方法查看netcore源代码,第一个就是微软官方开源的项目地址
今天我们主要讲使用Vs2019方法,Reshaper不建议去使用,电脑配置不高的情况下会很卡,而且vs2019的新功能也基本上够用了
使用vs2019先设置 工具->选项->文本编辑器->c#->高级->支持导航到反编译(实验)
勾上之后,按f12就能定位到源码

二.启动顺序
1 Main()入口
2 WebHostBuilder()准备
CreateDefaultBuilder方法 从命名就能看出,它注入了很多服务,大家可以定位进入仔细看看
创建WebHost默认配置,加载自定义配置UseStartup()主要在Startup.cs里面自行配置
主要是配置Service Di和http管道,这些都市在WebHost启动之前做的事
我们f12定位打源代码查看
public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
WebHostBuilder webHostBuilder = new WebHostBuilder();
if (string.IsNullOrEmpty(webHostBuilder.GetSetting(WebHostDefaults.ContentRootKey)))
{
webHostBuilder.UseContentRoot(Directory.GetCurrentDirectory());
}
if (args != null)
{
webHostBuilder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());
}
webHostBuilder.UseKestrel(delegate (WebHostBuilderContext builderContext, KestrelServerOptions options)
{
options.Configure(builderContext.Configuration.GetSection("Kestrel"));
}).ConfigureAppConfiguration(delegate (WebHostBuilderContext hostingContext, IConfigurationBuilder config)
{
IHostingEnvironment hostingEnvironment = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile("appsettings." + hostingEnvironment.EnvironmentName + ".json", optional: true, reloadOnChange: true);
if (hostingEnvironment.IsDevelopment())
{
Assembly assembly = Assembly.Load(new AssemblyName(hostingEnvironment.ApplicationName));
if (assembly != null)
{
config.AddUserSecrets(assembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
}).ConfigureLogging(delegate (WebHostBuilderContext hostingContext, ILoggingBuilder logging)
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
})
.ConfigureServices(delegate (WebHostBuilderContext hostingContext, IServiceCollection services)
{
services.PostConfigure(delegate (HostFilteringOptions options)
{
if (options.AllowedHosts == null || options.AllowedHosts.Count == )
{
string[] array = hostingContext.Configuration["AllowedHosts"]?.Split(new char[]
{
';'
}, StringSplitOptions.RemoveEmptyEntries);
options.AllowedHosts = ((array != null && array.Length != ) ? array : new string[]
{
"*"
});
}
});
services.AddSingleton((IOptionsChangeTokenSource<HostFilteringOptions>)new ConfigurationChangeTokenSource<HostFilteringOptions>(hostingContext.Configuration));
services.AddTransient<IStartupFilter, HostFilteringStartupFilter>();
})
.UseIIS()
.UseIISIntegration()
.UseDefaultServiceProvider(delegate (WebHostBuilderContext context, ServiceProviderOptions options)
{
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
});
return webHostBuilder;
}
3 Build()构建
构建AspNetCre.Hosting 托管web应用程序
4 Run()启动
运行web应用程序并阻止调用线程,直到主机关闭
CreateDefaultBuilder方法
说一下默认配置 配置了哪些东西,结合代码看一下
第一行 WebHostBuilder webHostBuilder = new WebHostBuilder(); 创建了webHostBuilder实例,我们F12进去看看
类里面的默认构造函数,看到这里,构造函数实例对象(依赖注入)


我们这里可以看到 提供了ApplicationBuilder工厂 然后把我们各种配置在这里进行直接注入了
在Starpup.cs里面 app.UseMvc() 这种 都是IApplicationBuilder
现在恍然大悟了
具体工厂里有什么呢,接口怎么定义呢,大家有兴趣可以自行去了解
第二行 webHostBuilder.UseContentRoot(Directory.GetCurrentDirectory());
Use是一个中间件,ContentRoot是我们内容的根目录,指定了了我们web主机要使用的内容站点根目录
这个设置决定了安排asp.net core开始搜索内容文件,比如view
也就是说 项目启动,肯定有一个中间件去调用wwwroot这个文件夹
后面还有UseConfiguration中间件 使用一些命令 比如dootnet run 在这里执行
UseKestrel 这是开启Kestrel中间件 给web主机使用的服务器,后面代码又开启了UseIIs的中间件
可能会疑惑为什么会开启不同的呢,
这里主要是,netcore有两种运营模式 一个进程内 一个是进程外,这个后续的文章会降到
看大这里,大家应该都知道.net core启动是个怎么回事了,剩下的 可以自行看源码了解哦
ps:码字水平有待提高!
ASP.NET CORE系列【七】分析NetCore启动原理的更多相关文章
- (2)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- .NetCore启动配置 和 .NetCoreWebApi
什么是.Net Core?.Net Core是微软开发的另外一个可以跨Linux.Windows.mac等平台的.Net.Net Core相关知识看文章地步dotnet dllname.dll 运行P ...
- asp.net core系列 76 Apollo 快速安装模式下填坑和ASP.NetCore结合使用
前言:由于公司占时没有运维,出于微服务的需要,Apollo只能先装在windows 阿里云上跑起来,由于环境及网络等问题,在安装过程中遇到很多坑,算是一个个坑填完后,最终实现. 一. java jdk ...
- ASP.NET Core系列(三):启动类Startup
前面讲了ASP.NET Core 的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zhangweizhong/category/1477144. ...
- 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志
前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...
- asp.net core 系列 16 Web主机 IWebHostBuilder
一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...
- 技术的正宗与野路子 c#, AOP动态代理实现动态权限控制(一) 探索基于.NET下实现一句话木马之asmx篇 asp.net core 系列 9 环境(Development、Staging 、Production)
黄衫女子的武功似乎与周芷若乃是一路,飘忽灵动,变幻无方,但举手抬足之间却是正而不邪,如说周芷若形似鬼魅,那黄衫女子便是态拟神仙. 这段描写出自<倚天屠龙记>第三十八回. “九阴神抓”本是& ...
- ASP.NET Core系列(二):创建第一个.Net Core 项目
前面讲过 .NET Core简介及开发环境安装,本章会讲一讲ASP.NET Core 2.0的项目结构,查看完整的ASP.NET Core系列文章:https://www.cnblogs.com/zh ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- asp.net core系列 30 EF管理数据库架构--必备知识 迁移
一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...
随机推荐
- 5分钟快速部署ownCloud私有云盘存储系统
ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可以像 Dropbox 那样实现文件跨平台同步.共享.版本控制.团队协作等等.o ...
- 如何查看jsplumb.js的API文档(YUIdoc的基本使用)
目录 一.问题描述 二. 处理方法 三. YUIdoc工具介绍 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端> ...
- MS SQL SERVER数据导入MySQL
1.sql server导出到xls,再导入到mysql中.亲测,单表数据量到百万以后,导出异常,可能由其它原因导致,没细纠.此种方式需要来回倒腾数据,稍繁琐. 2.采用kettle第三方的ETL工具 ...
- Java 7 源码学习系列(二)——Enum
Enum Enum类是java.lang包中一个类,他是Java语言中所有枚举类型的公共基类. 一.定义 public abstract class Enum<E extends Enum< ...
- 剑指offer第二版-总结:二叉树的遍历
思想:前序(根左右),中序(左根右),后序(左右根) 前序非递归遍历: 首先判断根是否为空,将根节点入栈 1.若栈为空,则退出循环 2.将栈顶元素弹出,访问弹出的节点 3.若弹出的节点的右孩子不为空则 ...
- 关于css样式加载的问题
今天我在学习jQuery的addClass操作时遇到了一个小问题,想来跟大家分享一下,避免初学者踩坑. 我的需求是制作一个表格,并让它隔行换色,在此基础上再加上鼠标悬浮变色的效果.(主要训练jQuer ...
- 哈夫曼编码与解码的C++实现:建立哈夫曼树、进行哈夫曼编码与解码
最近完成了数据结构课程设计,被分到的题目是<哈夫曼编码和解码>,现在在这篇博文里分享一下自己的成果. 我在设计时,在网上参考了很多老师和前辈的算法和代码,向他们表示感谢!他们的成果给了我很 ...
- 深入了解数据校验:Bean Validation 2.0(JSR380)
每篇一句 > 吾皇一日不退役,尔等都是臣子 对Spring感兴趣可扫码加入wx群:`Java高工.架构师3群`(文末有二维码) 前言 前几篇文章在讲Spring的数据绑定的时候,多次提到过数据校 ...
- 知识图谱学习与实践(4)——通过例句介绍Sparql的使用
通过例句介绍Sparql的使用 1 简介 SPARQL的定义,是一个递归的定义,为SPARQL Protocal and RDF Query Language,是W3C制定的RDF知识图谱标准查询语言 ...
- 【git】Git的使用
一.安装git 1.windows下安装一个Git 2.lInux下yum(apt-get) install git 二.使用git连接github 使用git连接github时,需要将linux下产 ...