大佬教程收集整理的这篇文章主要介绍了一张图理清ASP.NET Core启动流程,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
对于ASP.NET Core应用程序来说,我们要记住非常重要的一点是:其本质上是一个独立的控制台应用,它并不是必需在IIS内部托管且并不需要IIS来启动运行(而这正是ASP.NET Core跨平台的基石)。ASP.NET Core应用程序拥有一个内置的Self-Hosted(自托管)的Web Server(Web服务器),用来处理外部请求。
不管是托管还是自托管,都离不开Host(宿主)。在ASP.NET Core应用中通过配置并启动一个Host来完成应用程序的启动和其生命周期的管理(如下图所示)。而Host的主要的职责就是Web Server的配置和Pilpeline(请求处理管道)的构建。s.jianshu.io/upload_images/2799767-5ecdfc52c288b66a.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240" alt="ASP.NET Core总体启动流程">
所以,ASP.NET Core应用的启动本质上是启动作为宿主的WebHost对象。
其主要涉及到两个关键对象IWebHostBuilder
和IWebHost
,它们的内部实现是ASP.NET Core应用的核心所在。下面我们就结合源码并梳理调用堆栈来一探究竟!
在启动IWebHost
宿主之前,我们需要完成对IWebHost
的创建和配置。而这一项工作需要借助IWebHostBuilder
对象来完成的,ASP.NET Core中提供了默认实现WebHostBuilder
。而WebHostBuilder
是由WebHost的同名工具类(Microsoft.AspNetCore命名空间下)中的CreateDefaultBuilder
方法创建的。
s.jianshu.io/upload_images/2799767-cc75570a375e3e05.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240" alt="CreateDefaultBuilder()调用堆栈">
从上图中我们可以看出CreateDefaultBuilder()
方法主要干了六件大事:
创建完毕WebHostBuilder
后,通过调用UseStartup()
来指定启动类,来为后续服务的注册及中间件的注册提供入口。
在ASP.Net Core中定义了IWebHost
用来表示Web应用的宿主,并提供了一个默认实现WebHost
。宿主的创建是通过调用IWebHostBuilder
的Build()
方法来完成的。那该方法主要做了哪些事情呢,我们来看下面这张【ASP.NET Core启动流程调用堆栈】中的黄色边框部分:
s.jianshu.io/upload_images/2799767-956a061437103079.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240" alt="ASP.NET Core启动流程调用堆栈">
BuildBuildCommonservice
方法主要做了两件事:
HosTingStartupAttribute
特性以应用其他程序集中的启动配置
@H_674_43@注册通用服务
@H_674_43@若配置了启动程序集,则发现并以IStartup
类型注入到IOC容器中
public IWebHost Build()
{
//省略部分代码
var host = new WebHost(
applicationservices,hosTingserviceProvider,_options,_config,hosTingStartupErrors);
}
host.Initialize();
return host;
}
请求管道的构建,主要是中间件之间的衔接处理。
请求管道的构建主要是借助于IApplicationBuilder
,相关类图如下:s.jianshu.io/upload_images/2799767-b4bced8e49659acd.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240" alt="请求管道的构建">
s.jianshu.io/upload_images/2799767-3559356f56677a7d.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240" alt="启动WebHost调用堆栈">
从图中可以看出,第一步调用Initialize()
方法主要是取保请求管道的正确创建。其内部主要是对BuildApplication()
方法的调用,与我们上面所讲WebHost的构建环节具有相同的调用堆栈。而最终返回的正是由中间件衔接而成的requestDelegate
类型代表的请求管道。
我们先来看下类图:
s.jianshu.io/upload_images/2799767-311fe9a2b753718d.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240" alt="IServer类图">
从类图中我们可以看出IServer
接口主要定义了一个只读的特性集合属性、一个启动和停止的方法声明。在创建宿主构造器IWebHostBuilder
时我们通过调用UseKestrel()
方法指定了使用KestrelServer作为默认的IServer实现。其方法申明中接收了一个IhttpApplication
的参数,从命名来看,它代表一个http应用程序,我们来看下具体的接口定义:
s.jianshu.io/upload_images/2799767-ec6da9b7c1a03061.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240" alt="IhttpApplication类图">
其主要定义了三个方法,@R_616_6717@来创建请求上下文;第二个方法用来处理请求;第三个方法用来释放上下文。而至于请求上下文,是用来携带请求和返回响应的核心参数,其贯穿与整个请求处理管道之中。ASP.NET Core中提供了默认的实现HosTingApplication
,其构造函数接收一个requestDelegate _application
(也就是链接中间件形成的处理管道)用来处理请求。
var httpContextFactory = _applicationservices.Getrequiredservice();
var hosTingApp = new HosTingApplication(_application,_logger,diagnosticsource,httpContextFactory);
IHostedservice
接口用来定义后台任务,通过实现该接口并注册到Ioc容器中,它会随着ASP.NET Core 程序启动而启动,终止而终止。
结合源码,通过对ASP.NET Core运行调用堆栈的梳理,其启动流程的总体脉络一目了然,并且了解到主要的几个关键对象:
s.jianshu.io/upload_images/2799767-7c7576892238b563.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240">
以上是大佬教程为你收集整理的一张图理清ASP.NET Core启动流程全部内容,希望文章能够帮你解决一张图理清ASP.NET Core启动流程所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。