欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET CORE系列【七】分析NetCore启动原理

程序员文章站 2023-01-01 20:35:16
前言 有很久一段时间没更新了,因为工作和家里的问题导致没能坚持, 现在开始会继续每周更新,主要是记录自己所学和一起讨论解决过的问题,一起成长, 为.net圈子添砖加瓦! 介绍 到目前为止应该很多同学已经把项目升级到core了,对于项目结构都已经很熟悉了,今天我们主要讲解Startup.Cs Prog ......

前言

 有很久一段时间没更新了,因为工作和家里的问题导致没能坚持,

现在开始会继续每周更新,主要是记录自己所学和一起讨论解决过的问题,一起成长,

为.net圈子添砖加瓦!

介绍

到目前为止应该很多同学已经把项目升级到core了,对于项目结构都已经很熟悉了,今天我们主要讲解startup.cs   program.cs两个文件

分析core项目的启动原理

 

program.cs

ASP.NET CORE系列【七】分析NetCore启动原理

 

 

   很熟悉main入口,主要是三个方法createwebhostbuilder()    build()  run()  很简单的三个方法,但是他却能够顺利的把整个项目给启动起来

   它肯定是在内部封装了很多东西,那它是如何封装的呢  是如何运行的

    一.首先我们得学会查看源码

     1.https://github.com/aspnet/aspnetcore

     2.vs2019

     3.reshaper

      这里有三个方法查看netcore源代码,第一个就是微软官方开源的项目地址

      今天我们主要讲使用vs2019方法,reshaper不建议去使用,电脑配置不高的情况下会很卡,而且vs2019的新功能也基本上够用了

     使用vs2019先设置   工具->选项->文本编辑器->c#->高级->支持导航到反编译(实验)

    勾上之后,按f12就能定位到源码

ASP.NET CORE系列【七】分析NetCore启动原理

 

二.启动顺序

 1 main()入口   

 

 2 webhostbuilder()准备 

     createdefaultbuilder方法 从命名就能看出,它注入了很多服务,大家可以定位进入仔细看看

     创建webhost默认配置,加载自定义配置usestartup()主要在startup.cs里面自行配置

    主要是配置service di和http管道,这些都市在webhost启动之前做的事

    我们f12定位打源代码查看

 1 public static iwebhostbuilder createdefaultbuilder(string[] args)
 2         {
 3             webhostbuilder webhostbuilder = new webhostbuilder();
 4             if (string.isnullorempty(webhostbuilder.getsetting(webhostdefaults.contentrootkey)))
 5             {
 6                 webhostbuilder.usecontentroot(directory.getcurrentdirectory());
 7             }
 8             if (args != null)
 9             {
10                 webhostbuilder.useconfiguration(new configurationbuilder().addcommandline(args).build());
11             }
12             webhostbuilder.usekestrel(delegate (webhostbuildercontext buildercontext, kestrelserveroptions options)
13             {
14                 options.configure(buildercontext.configuration.getsection("kestrel"));
15             }).configureappconfiguration(delegate (webhostbuildercontext hostingcontext, iconfigurationbuilder config)
16             {
17                 ihostingenvironment hostingenvironment = hostingcontext.hostingenvironment;
18                 config.addjsonfile("appsettings.json", optional: true, reloadonchange: true).addjsonfile("appsettings." + hostingenvironment.environmentname + ".json", optional: true, reloadonchange: true);
19                 if (hostingenvironment.isdevelopment())
20                 {
21                     assembly assembly = assembly.load(new assemblyname(hostingenvironment.applicationname));
22                     if (assembly != null)
23                     {
24                         config.addusersecrets(assembly, optional: true);
25                     }
26                 }
27                 config.addenvironmentvariables();
28                 if (args != null)
29                 {
30                     config.addcommandline(args);
31                 }
32             }).configurelogging(delegate (webhostbuildercontext hostingcontext, iloggingbuilder logging)
33             {
34                 logging.addconfiguration(hostingcontext.configuration.getsection("logging"));
35                 logging.addconsole();
36                 logging.adddebug();
37                 logging.addeventsourcelogger();
38             })
39                 .configureservices(delegate (webhostbuildercontext hostingcontext, iservicecollection services)
40                 {
41                     services.postconfigure(delegate (hostfilteringoptions options)
42                     {
43                         if (options.allowedhosts == null || options.allowedhosts.count == 0)
44                         {
45                             string[] array = hostingcontext.configuration["allowedhosts"]?.split(new char[1]
46                             {
47                                 ';'
48                             }, stringsplitoptions.removeemptyentries);
49                             options.allowedhosts = ((array != null && array.length != 0) ? array : new string[1]
50                             {
51                                 "*"
52                             });
53                         }
54                     });
55                     services.addsingleton((ioptionschangetokensource<hostfilteringoptions>)new configurationchangetokensource<hostfilteringoptions>(hostingcontext.configuration));
56                     services.addtransient<istartupfilter, hostfilteringstartupfilter>();
57                 })
58                 .useiis()
59                 .useiisintegration()
60                 .usedefaultserviceprovider(delegate (webhostbuildercontext context, serviceprovideroptions options)
61                 {
62                     options.validatescopes = context.hostingenvironment.isdevelopment();
63                 });
64             return webhostbuilder;
65         }

 3 build()构建   

   构建aspnetcre.hosting 托管web应用程序

 4 run()启动

   运行web应用程序并阻止调用线程,直到主机关闭

   

 

createdefaultbuilder方法

 说一下默认配置 配置了哪些东西,结合代码看一下

 第一行   webhostbuilder webhostbuilder = new webhostbuilder(); 创建了webhostbuilder实例,我们f12进去看看

 类里面的默认构造函数,看到这里,构造函数实例对象(依赖注入)

  ASP.NET CORE系列【七】分析NetCore启动原理

 

 


 ASP.NET CORE系列【七】分析NetCore启动原理

 

 我们这里可以看到 提供了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:码字水平有待提高!