asp.Net   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了一张图理清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对象。 其主要涉及到两个关键对象IWebHostBuilderIWebHost,它们的内部实现是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()方法主要干了六件大事:

    @H_674_43@UseKestrel:使用Kestrel作为Web server。 @H_674_43@UseContentRoot:指定Web host使用的content root(内容根目录),比如Views。默认为当前应用程序根目录。 @H_674_43@ConfigureAppConfiguration:设置当前应用程序配置。主要是读取 appsetTinggs.json 配置文件、开发环境中配置的UserSecrets、添加环境变量和命令行参数 。 @H_674_43@ConfigureLogging:读取配置文件中的Logging节点,配置日志系统。 @H_674_43@UseIISIntegration:使用IISIntegration 中间件。 @H_674_43@UseDefaultserviceProvider:设置默认的依赖注入容器。

创建完毕WebHostBuilder后,通过调用UseStartup()来指定启动类,来为后续服务的注册及中间件的注册提供入口。

在ASP.Net Core中定义了IWebHost用来表示Web应用的宿主,并提供了一个默认实现WebHost。宿主的创建是通过调用IWebHostBuilderBuild()方法来完成的。那该方法主要做了哪些事情呢,我们来看下面这张【ASP.NET Core启动流程调用堆栈】中的黄色边框部分:

s.jianshu.io/upload_images/2799767-956a061437103079.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240" alt="ASP.NET Core启动流程调用堆栈">

BuildBuildCommonservice方法主要做了两件事:

    @H_674_43@查找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;

}


<h2 id="构建请求处理管道">3.3. 构建请求处理管道

请求管道的构建,主要是中间件之间的衔接处理。

请求管道的构建主要是借助于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 application的参数,从命名来看,它代表一个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);

service">4.3. 启动IHostedservice

IHostedservice接口用来定义后台任务,通过实现该接口并注册到Ioc容器中,它会随着ASP.NET Core 程序启动而启动,终止而终止。

结合源码,通过对ASP.NET Core运行调用堆栈的梳理,其启动流程的总体脉络一目了然,并且了解到主要的几个关键对象:

    @H_674_43@负责创建IWebHost的宿主构造器IWebHostBuilder @H_674_43@代表宿主的IWebHost接口 @H_674_43@用于构建请求管道的IApplicationBuilder @H_674_43@中间件衔接而成的requestDelegate @H_674_43@代表Web Server的IServer接口 @H_674_43@贯穿请求处理管道的请求上下文httpContext @H_674_43@可以用来注册后台服务的IHostedservice接口

s.jianshu.io/upload_images/2799767-7c7576892238b563.png?imageMogr2/auto-orient/Strip%7CimageView2/2/w/1240">

本文经原创认证,作者,访问查询【】获取授权信息。

大佬总结

以上是大佬教程为你收集整理的一张图理清ASP.NET Core启动流程全部内容,希望文章能够帮你解决一张图理清ASP.NET Core启动流程所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。

标签: