简介:

开发使用有三年经验了,想趁这个机会把net core的知识点梳理一下,也更好的研究一下.NET 5给我们带来的变化。

主机的概念:

一个主机是封装了应用程序的资源,比如一个对象:

  • 依赖注入 (DI)
  • 日志记录
  • 配置
  • IHostedService 实现

将应用程序的所有相互依赖的资源包含在一个对象中的主要原因是生命周期管理:控制应用程序启动和正常关闭。

主机的创建

主机通常由Program类中的代码配置、构建和运行。该Main方法:

  • 调用CreateHostBuilder方法来创建和配置构建器对象。
  • 构建器对象上的调用Build和Run方法.

1. Host.CreateDefaultBuilder(args) 主要做了以下几件事:

  • 内容根设置为GetCurrentDirectory返回的路径。
  • 从以下位置加载主机配置:
    • DOTNET_.为前缀的环境变量。
    • 命令行参数。
  • 从以下位置加载应用程序配置:
    • appsettings.json
    • appsettings.{Environment}.json
    • 应用程序在Development环境中运行时的用户机密
    • 环境变量。
    • 命令行参数。
  • 添加以下日志记录提供程序:
    • 安慰
    • 调试
    • 事件源
    • EventLog(仅当在 Windows 上运行时)
  • 当环境为 Development 时启用范围验证依赖项验证

2. 对于http 工作负载,使用ConfigureWebHostDefaults 去实例化一个IWebHostBuilder并且向webbuilder增加功能配置。

public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder, 

Action<IWebHostBuilder> configure)
{
if (configure is null)
{
throw new ArgumentNullException(nameof(configure));
} return builder.ConfigureWebHost(webHostBuilder =>
{
WebHost.ConfigureWebDefaults(webHostBuilder); configure(webHostBuilder);
});
}

可以看到,ConfigureWebHostDefaults 是一个扩展方法,在内部调用 ConfigureWebHost 这个扩展方法,

ConfigureWebHost 这个扩展方法又做了哪些事情? 代码链接:https://github.com/dotnet/aspnetcore/blob/main/src/Hosting/Hosting/src/GenericHostWebHostBuilderExtensions.cs

public static class GenericHostWebHostBuilderExtensions
{
/// <summary>
/// Adds and configures an ASP.NET Core web application.
/// </summary>
public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action<IWebHostBuilder> configure)
{
if (configure is null)
{
throw new ArgumentNullException(nameof(configure));
} return builder.ConfigureWebHost(configure, _ => { });
} /// <summary>
/// Adds and configures an ASP.NET Core web application.
/// </summary>
public static IHostBuilder ConfigureWebHost(this IHostBuilder builder, Action<IWebHostBuilder> configure, Action<WebHostBuilderOptions> configureWebHostBuilder)
{
if (configure is null)
{
throw new ArgumentNullException(nameof(configure));
} if (configureWebHostBuilder is null)
{
throw new ArgumentNullException(nameof(configureWebHostBuilder));
} var webHostBuilderOptions = new WebHostBuilderOptions();
configureWebHostBuilder(webHostBuilderOptions);
var webhostBuilder = new GenericWebHostBuilder(builder, webHostBuilderOptions);
configure(webhostBuilder);
builder.ConfigureServices((context, services) => services.AddHostedService<GenericWebHostService>());
return builder;
}
}

通过实例化一个 GenericWebHostBuilder 实例,扩展HostBuilder ASP.NET Core的运行时配置。

ConfigureWebHost 中的confiure 其实执行的是:

WebHost.ConfigureWebDefaults(webHostBuilder);

configure(webHostBuilder); (2)

(2) 执行的是我们在program 代码里进行的设置。例如 webBuilder.UseStartup<Startup>()。

有读者比较感兴趣 GenericWebHostBuilder 这个类具体都做了什么,因为内容较多,不放在这里展示,实例化后的 WebHostBuilder 内部拥有 HostBuilder,并且为其扩展了各种web 运行时的配置;

最后,回到 WebHost.ConfigureWebDefaults(webHostBuilder) ,它为注入的 webHostBuilder启用各类配置:

  • 从前缀为 的环境变量加载主机配置ASPNETCORE_
  • Kestrel服务器设置为 Web 服务器并使用应用的托管配置提供程序对其进行配置。
  • 添加主机过滤中间件
  • 如果等于,则添加转发头中间件ASPNETCORE_FORWARDEDHEADERS_ENABLEDtrue
  • 启用 IIS 集成。

3. 主机的build

通过 CreateHostBuilder(args).Build() 去构建主机。

这其中主要是:

  • 构建配置系统
  • 构建主机环境信息
  • 构建主机build 上下文
  • 构建应用程序配置
  • 创建依赖注入提供程序,依赖注入容器

总而言之:(如果你忽略上面的一整段,此处要看)

(1) 创建了HostBuilder -> (2) 为hostbuilder添加 aspnet core运行时的配置 -> (3) 启用各类web 运行时需要的配置 -> (4) 根据加载好的各种配置构建主机运行时需要提供的服务(configuration, DI Container, 应用程序配置等)

会持续整理发布关于后端和NET Core, .NET 的相关学习和认知,欢迎大家一起讨论学习。

.Net Core Host 之详解的更多相关文章

  1. net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解

    asp.net core环境变量详解   环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...

  2. Linux core dump file详解

    Linux core dump file详解 http://www.cnblogs.com/langqi250/archive/2013/03/05/2944931.html

  3. 【转】asp.net core环境变量详解

    asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境 ...

  4. asp.net core环境变量详解

    环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...

  5. ASP.NET Core真实管道详解[1]:中间件是个什么东西?

    ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 <ASP.NET Core管道深度剖析[共4篇]> 中围绕着一个经过极度简化的模拟 ...

  6. ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解 (转载)

    “传导体” HttpContext 要理解 HttpContext 是干嘛的,首先,看图 图一 内网访问程序 图二 反向代理访问程序 ASP.NET Core 程序中,Kestrel 是一个基于 li ...

  7. ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解

    笔者没有学 ASP.NET,直接学 ASP.NET Core ,学完 ASP.NET Core MVC 基础后,开始学习 ASP.NET Core 的运行原理.发现应用程序有一个非常主要的 “传导体” ...

  8. ASP.NET Core真实管道详解[1]

    ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 <ASP.NET Core管道深度剖析[共4篇]> 中围绕着一个经过极度简化的模拟 ...

  9. MongoDB via Dotnet Core数据映射详解

    用好数据映射,MongoDB via Dotnet Core开发变会成一件超级快乐的事.   一.前言 MongoDB这几年已经成为NoSQL的头部数据库. 由于MongoDB free schema ...

随机推荐

  1. PHPcms v9.6.0 文件上传漏洞

    title: PHPcms v9.6.0 文件上传漏洞 date: 2021-4-5 tags: 渗透测试,CVE漏洞复现,文件上传 categories: 渗透测试 CVE漏洞复现 文件上传 PHP ...

  2. 客户端保存token到sessionStorage

    将token保存到客户端的sessionStorage 一.区分localStorage和sessionStorage localStorage是本地持久化存储 sessionStorage是浏览器会 ...

  3. Apache Flink 1.12.0 正式发布,DataSet API 将被弃用,真正的流批一体

    Apache Flink 1.12.0 正式发布 Apache Flink 社区很荣幸地宣布 Flink 1.12.0 版本正式发布!近 300 位贡献者参与了 Flink 1.12.0 的开发,提交 ...

  4. Centos7 搭建vsftpd

    1.安装vsftpd 在线安装:yum -y install vsftpd 离线安装:下载vsftp的rpm包,通过rpm -ivh xxx.rpm安装 2.修改/etc/vsftpd/vsftpd. ...

  5. 利用redis未授权访问漏洞(windows版)

    0x00 原理   首先需要知道的是,redis是一种非关系型数据库.它在默认情况下,绑定在0.0.0.0:6379 ,若不采取相关策略,比如添加防火墙限制非信任IP访问,会使得redis服务暴露到公 ...

  6. 基于雪花算法生成分布式ID(Java版)

    SnowFlake算法原理介绍 在分布式系统中会将一个业务的系统部署到多台服务器上,用户随机访问其中一台,而之所以引入分布式系统就是为了让整个系统能够承载更大的访问量.诸如订单号这些我们需要它是全局唯 ...

  7. python批量向kafka塞数据

    python批量向kafka塞数据 from kafka import KafkaClient from kafka.producer import SimpleProducer from kafka ...

  8. Java设计模式(2:单一职责原则和依赖倒置原则详解)

    一.单一职责原则 不要存在多于一个导致类变更的原因.简单来说,就是一个Class/Interface/Method只负责一项职责. 这句话最为重要的就是这一段:一个Class/Interface/Me ...

  9. 3D-LaneNet:端到端三维多车道检测ICCV2019

    3D-LaneNet:端到端三维多车道检测ICCV2019 3D-LaneNet: End-to-End 3D Multiple Lane Detection 论文链接: http://openacc ...

  10. Docker Context基本原理

    Docker Context基本原理 介绍 本指南介绍了上下文如何使单个Docker CLI轻松管理多个Swarm集群.多个Kubernetes集群和多个单独的Docker节点. 单个Docker C ...