简介:

开发使用有三年经验了,想趁这个机会把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. Gin框架介绍与使用

    Gin // 初识 Gin框架 //下载(可能会下载不全.缺什么get什么即可) //go get -u -v github.com/gin-gonic/gin package main import ...

  2. [Java] 部署到Linux

    阿里云 控制台->云服务器ECS->实例->创建实例 计费方式 地域 网络 安全组:默认安全组 公网IP地址:分配 实例 公网带宽:1M ECS服务器:公共镜像CentOS 存储 购 ...

  3. Linux下获取当前的目录,需执行以下命令: $(cd `dirname $0`;pwd)

    Linux下获取当前的目录,需执行以下命令: $(cd `dirname $0`;pwd) 其中,   dirname $0,取得当前执行的脚本文件的父目录       cd `dirname $0` ...

  4. [转载]有些shell文件中为啥要用$(cd “$(dirname $0)“; pwd),pwd它不香吗

    $(cd "$(dirname "$0")",pwd) 解析   xx.sh 文件内容如下: #!/bin/bash BIN_FOLDER=$(cd " ...

  5. deep

    deepinv20已经解决 sudo apt update && sudo apt upgrade

  6. Linux 忘记密码解决方法——RedHat

    [RedHat7.4版本] 1.将忘记密码的rhel7.4版本的虚拟机打开 2.等3秒左右出现这个画面时,用方向键,将光标移动到第二栏处,接着按"e"键 3.接在在linux16这 ...

  7. 9.13-15 runlevel & init & service

    runlevel:输出当前运行级别 runlevel命令用于输出当前Linux系统的运行级别. -quiet 不输出结果,用于通过返回值判断的场合 [root@cs6 ~]# runlevel N 3 ...

  8. mysql左连接和分组实例

    例: 需求:查询A表中的所有列,并查询A表中的数据(ID)在B表中出现的次数,然后按model排序,最后所有结果在一张表中展示 A表结构: B表结构: ini_device_policy表中id与in ...

  9. 服务器RAID配置

    一.RAID介绍RAID是Redundent Array of Inexpensive Disks的缩写,直译为"廉价冗余磁盘阵列",也简称为"磁盘阵列".后来 ...

  10. Python对比两个txt文件内容

    difflib模块作为python的标准库模块,无需安装,作用是比对文本之间的差异,且支持输出可读性比较强的html格式.#!coding=utf-8 # 2018-9-19 import sys i ...