zoukankan      html  css  js  c++  java
  • Asp.Net.Core 系列-中间件和依赖注入Hosting篇

     本文讲解Microsoft.AspNetCore.Hosting的知识点

    先看一下,.Net.Core哪些地方用到了?

    在Program.cs中的

     var host = new WebHostBuilder().UseKestrel()

    .UseContentRoot(Directory.GetCurrentDirectory())

    .UseIISIntegration()
    .UseStartup<Startup>()
    .UseApplicationInsights()
    .Build();

    host.Run();

    第一眼看到的就是WebHostBuilder类实例化,那么一切都清楚了,实例化了一个WebHostBuilder去承载服务和路径等等,那么也就知道了使用UserXXXX(),我们右键查看,就会看到这些都是Microsoft.AspNetCore.Hosting的扩展。当然我们也可以使用ConfigureServices来承载,当然我们查看查看源代码UseXXXX()实际也是调用了ConfigureServices来承载。

    如何理解承载?

    .NET平台的核心技术为:通用语言运行时(CLR:Common Language Runtiome),那么web程序就是承载在CLR上面。当然我们可以读一读《CLR via C#》这本书。

    它可以为自己加载合适的CLR来运行Web应用,这就是承载。

    先看看Program.cs中有哪些承载,UseKestrel承载核心懂Linux很好理解,这个就是运行CLR上面,UseContentRoot承载路径,UseIISIntegration承载IIS就这是我们可以把部署到windows上面的基础,UseStartup承载了一个StartUp类,这个类里面有中间件和服务等等,UseApplicationInsights承载应用程序,Build添加服务了,依赖注入到服务器了。host.Run();这就是运行了。

    现在我们可以根据上面的说法,看一下源代码来了解承载吧。

    微软定义了IWebHostBuilder接口来写承载,WebHostBuilder就继承了IWebHostBuilder接口。附上源代码文件链接(https://github.com/aspnet/Hosting):

    我们先看实例化:

    看源代码我们可以看到委托,承载的环境,一些基本配置。

    WebHostDefaults的配置就是把当前环境的一些信息,承载到了CLR上面了。

    接着看:

    public IWebHostBuilder ConfigureServices(Action<IServiceCollection> configureServices){}

    这个我们一看就很熟悉吧,这就是我们承载服务的方法,就是把我们写的功能承载到了_configureServicesDelegates委托中。

     public IWebHost Build(){}

    这个才是我们今天要看明白的地方。其中BuildCommonServices就是服务以委托的形式存在,将配置的服务放入到ServiceCollection,还有加入其它服务。这里面内容很多,就是构造了一个服务委托链,说白了就是生成了一个个管道。

    接着看:host.Run();

    调用了Server.Start()方法,

    它的作用就是配合Server去创建上下文,大概的过程就是

    1. 服务器把请求的信息放入一个IFeatureCollection的变量里面;
    2. 利用上面的信息构造上下文;
    3. 调用ProcessRequestAsync()方法处理请求,此时请求进入处理管道(Pipeline)。

    总结一下:

    1. 首先使用WebHostBuildler注册基本信息,比如用哪个服务器?根目录是哪个?StartUp的元数据等等;
    2. 在WebHost = WebHostBuildler.Build()过程中,添加大量基本服务+StartUp.ConfigureServices()方法中的服务;
    3. 在WebHost.Initialize()方法中,利用StartUp.Configure()方法中使用的服务+一些默认使用的服务组建请求管道,并存储在_application字段中;
    4. 使用_application构造一个HostingApplication,并传入WebHost.Run()->WebHost.Start()->Server.Start()方法;
    5. Server使用HostingApplication来构造HttpContext,并使用请求管线(Pipeline)处理它。
  • 相关阅读:
    【重点】2020年宝山区义务教育阶段学校校区范围与招生计划(初中)
    转: 彻底理解 Spring 容器和应用上下文
    转《深入理解 Java 内存模型》读书笔记
    Mysql Update 流程摘抄
    统一支付接口设计
    支付系统 简版设计
    订单1:n支付单 设计讨论
    RocketMQ 使用情况梳理
    转 Java jar (SpringBoot Jar)转为win可执行的exe程序
    Git flow 工作流与规范
  • 原文地址:https://www.cnblogs.com/jristy/p/7340201.html
Copyright © 2011-2022 走看看