ASP.NET Core源码的学习,我们从Hosting开始,

Hosting的GitHub地址为:https://github.com/aspnet/Hosting.git

朋友们可以从以上链接克隆或是下载。

为什么是从Hosting开始学习呢?我们来看看ASP.NET Core MVC项目中的Pragram.CS中的Main()方法.

我们可以看到,MVC的项目首先是从IWebHostBuilder开始的,webhostbuilder执行Build方法后,就能构建出WebHost实例,而WebHost实例就是一个一直运行监听http请求的Task。所以,下面,我们从WebHostBuilder的Build讲起。

WebBuilder位于SRC->Mircosoft.AspNetCore.Hosting下。我们来看看它的Build方法。

在抛弃前面一堆代码后,我们看到,首先是通过BuildCommonServices来构建一个ServiceCollection。那么我们来看看BuildCommonService在构建ServiceCollection的过程中欧个,都在做些什么。我们先跳转到BuidCommonServices方法。

我首先注意到,构建的是一个ServiceCollection然后往services实例里面注入了一些东西,这些东西包括MiddlewareFactory中间件工厂,HttpContextFactory等,在这里对系统一些必要的依赖进行了注入。

在这些依赖注入中,有一个非常重要的依赖注入是StartUp的依赖注入,首先,判断Startup类是否继承于IStartup接口,如果是继承的,那么就可以直接加入在Services里面去,如果不是继承的话,就需要通过ConventionBasedStartup(methods)把method转换成IStartUp后加入到Services里面去。

事实上,我留意到,我们平时建立的startup类都是没有继承于Istartup接口的。

所以,它应该是被Convent转换成IStartUp后,再依赖注入到services中去的。

然后,在BuildCommonServices最后,service被返回了。

我们回到Build方法。

拿到了hostingServices也就是BuildCommonServices中返回的service也就是ServiceCollection实例后,通过ServieCollection的BuildSerceProvider方法构造出了ServiceProvider实例。到目前为止,ServiceCollection和ServiceProvider都拿到了。

然后,利用拿到的ServceiCollection和ServiceProvider构造出WebHost实例。构造了WebHost实例还不能直接返回,通过Initialize对WebHost实例进行初始化。那我们看看在初始化函数Initialize中,都做了什么事情。

在构造函数中看不出什么,主要的动作被引导到了BuildApplication函数中

在BuidApplication函数中,主要是EnsureApplicationServices和EnsureService()

EnsureApplicarionServcie函数中,主要是先通过EnsureStartUp拿到Startup对象,拿到startUp对象后,通过_startup.ConfigureServices拿到ServiceProvider。

到此为止,startUp和ServiceProvider都有了。

差不多就可以运行WebHost了,我们看看在WebHost的Run方法中都做了什么事情。

Webhost的Run方法在WebHostExtensions.cs类中,该类同样位于Microsoft.AspNetCore.Hosting下。

首先,WebHost执行RunAsync运行web应用程序并返回一个只有在触发或关闭令牌时才完成的任务。

这就是我们运行ASP.Net Core程序的时候,看到的那个命令行窗口了,如果部关闭窗口或者Ctrl+C的话是无法结束的。

到此为止,同WebHost的Build到Run中的重点差不多就分析结束了。我简要画了一个流程图,希望能帮助大家理解整过过程。

ASP.NET Core源码学习(一)Hosting的更多相关文章

  1. ASP.NET Core 源码学习之 Logging[1]:Introduction

    在ASP.NET 4.X中,我们通常使用 log4net, NLog 等来记录日志,但是当我们引用的一些第三方类库使用不同的日志框架时,就比较混乱了.而在 ASP.Net Core 中内置了日志系统, ...

  2. 【ASP.NET Core 】ASP.NET Core 源码学习之 Logging[1]:Introduction

    在ASP.NET 4.X中,我们通常使用 log4net, NLog 等来记录日志,但是当我们引用的一些第三方类库使用不同的日志框架时,就比较混乱了.而在 ASP.Net Core 中内置了日志系统, ...

  3. ASP.NET Core 源码学习之 Options[1]:Configure

    配置的本质就是字符串的键值对,但是对于面向对象语言来说,能使用强类型的配置是何等的爽哉! 目录 ASP.NET Core 配置系统 强类型的 Options Configure 方法 源码解析 ASP ...

  4. ASP.NET Core 源码学习之 Options[4]:IOptionsMonitor

    前面我们讲到 IOptions 和 IOptionsSnapshot,他们两个最大的区别便是前者注册的是单例模式,后者注册的是 Scope 模式.而 IOptionsMonitor 则要求配置源必须是 ...

  5. ASP.NET Core 源码学习之 Logging[2]:Configure

    在上一章中,我们对 ASP.NET Logging 系统做了一个整体的介绍,而在本章中则开始从最基本的配置开始,逐步深入到源码当中去. 默认配置 在 ASP.NET Core 2.0 中,对默认配置做 ...

  6. ASP.NET Core 源码学习之 Logging[3]:Logger

    上一章,我们介绍了日志的配置,在熟悉了配置之后,自然是要了解一下在应用程序中如何使用,而本章则从最基本的使用开始,逐步去了解去源码. LoggerFactory 我们可以在构造函数中注入 ILogge ...

  7. ASP.NET Core 源码学习之 Options[2]:IOptions

    在上一篇中,介绍了一下Options的注册,而使用时只需要注入IOption即可: public ValuesController(IOptions<MyOptions> options) ...

  8. ASP.NET Core 源码学习之 Logging[4]:FileProvider

    前面几章介绍了 ASP.NET Core Logging 系统的配置和使用,而对于 Provider ,微软也提供了 Console, Debug, EventSource, TraceSource ...

  9. ASP.NET Core 源码学习之 Options[3]:IOptionsSnapshot

    在 上一章 中,介绍了 IOptions 的使用, 而我们知道,在ConfigurationBuilder的AddJsonFile中,有一个reloadOnChange参数,设置为true时,在配置文 ...

随机推荐

  1. 《深入理解Java虚拟机》学习笔记(二)

    垃圾回收的前提是判断对象是否存活,对象不再存活时将会被回收,下面是2种判断的方法. 引用计数法: 主流的Java虚拟机并没有使用引用计数法来管理内存,重要的原因就是循环引用的问题难以解决. 可达性分析 ...

  2. Django搭建博客网站(三)

    Django搭建博客网站(三) 第三篇主要记录view层的逻辑和template. Django搭建博客网站(一) Django搭建博客网站(二) 结构 网站结构决定我要实现什么view. 我主要要用 ...

  3. python爬虫(3)——SSL证书与Handler处理器

    一.SSL证书问题 上一篇文章,我们创建了一个小爬虫,下载了上海链家房产的几个网页.实际上我们在使用urllib联网的过程中,会遇到证书访问受限的问题. 处理HTTPS请求SSL证书验证,如果SSL证 ...

  4. php与web页面交互(二)

    一.获取表单数据 1.1 使用POST()方法提交表单  ---POST()方法可以没有限制地传递数据到服务器,所提交的数据在后台传输,用户在浏览器端是看不到这一过程的,安全性高,适用于发送保密数据和 ...

  5. qt中的多线程

    1.dialog.h #define DIALOG_H #include <QDialog>#include"mythread.h"namespace Ui {clas ...

  6. Filezilla Server 出现Error, could not connect to server解决办法

    打开任务管理器:Win+R:services.msc找到Filezilla Server并启动服务

  7. codeforces 940D 比赛总结

    这次比赛总体还行,但是并没发挥到极致 A题 速度正常 题解 B题 这个题先是没注意时间复杂度,tle了,好不容易优化了没多测几组就交了,很开心的wa了,查了一边发现没特判k,改好后有草率地交了,又wa ...

  8. 利用Python爬取可用的代理IP

    前言 就以最近发现的一个免费代理IP网站为例:http://www.xicidaili.com/nn/.在使用的时候发现很多IP都用不了. 所以用Python写了个脚本,该脚本可以把能用的代理IP检测 ...

  9. mysql有多条记录的单个字段想存为一个字段显示的方法

    SELECT po.id,(SELECT GROUP_CONCAT(mr.member_type) as memberTypeList FROM prod_offer_member_rel mr WH ...

  10. 使用C#开发C/S框架高级版添加新项目实例

    操作步骤: 1.新建一个项目CSFramework3.test,在CSFramework3.test项目下新建一个FormMan窗口(此时不需要继承). 2.按F7打开类,替换一下引用 using S ...