加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 09:18:33 所属栏目:asp.Net 来源:网络整理
导读:前言 ?有很久一段时间没更新了,因为工作和家里的问题导致没能坚持, 现在开始会继续每周更新,主要是记录自己所学和一起讨论解决过的问题,一起成长, 为.net圈子添砖加瓦! 介绍 到目前为止应该很多同学已经把项目升级到core了,对于项目结构都已经很熟悉

前言

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

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

为.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定位打源代码查看

 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",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         }
View Code

?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:码字水平有待提高!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读