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定位打源代码查看 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 } ?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-mvc – 在MVC项目中放置一个简单的类?
- 获取当前的ASP.NET机器密钥
- asp.net-mvc – 从DataAnnotation类中渲染LabelFor无标签标
- asp.net-mvc – ASP.NET MVC文化更改日期时间格式
- asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分
- asp.net-mvc – 从Asp.Net Mvc应用程序找不到DataContractJ
- 如何使用asp.net webapi获取Json Post Values
- 如何在asp.net会员中手动更改密码?
- asp.net-mvc-2 – ASP.NET MVC2 Ninject NLog(shared hosti
- asp.net-mvc – HttpResponseBase的WebResponse.可能吗?
- asp.net-web-api – DNN API基于角色的授权
- asp.net – Web用户控件通过XML填充项目
- ASP.NET 4 URL路由Web表单打破了我对样式,脚本,图
- asp.net – IIS 6不显示默认文档(default.aspx)
- asp.net-mvc-3 – ASP.Net MVC3路由保留字?
- asp.net – 实体框架删除子对象
- asp.net-mvc – ASP.NET MVC:获取所有控制器
- “XmlDocumentationProvider”不实现接口成员“I
- asp.net-mvc – OAuth 2 Google API刷新令牌为空
- asp.net-mvc – 刷新IdentityServer4客户端中的访