首页 > 其他分享 >主机--Host

主机--Host

时间:2024-02-02 10:44:21浏览次数:35  
标签:调用 WebHost -- 主机 配置 Host 方法

概念:主机是用于构建应用程序和服务、封装应用资源的对象,负责程序的启动和生命周期的管理,简单来说主机即应用程序。

主机运行:当主机运行的时候,他会将托管在服务容器集合里面注册的IHostService的每个实现调用IHostService.StartAsync()。在web应用中,每一个IHostService实现就是启动。

微软官网地址

需要掌握:

  • 主机的作用是什么?
  • 主机的种类、对应的版本?
  • 泛型主机的代码上和逻辑上的构造流程
  • 泛型主机替换Web主机的原因以及通过什么拓展方法来支持Http负载?

主机的种类和构建方式

1. WebHost(范围:3.0版本之前)官网

在3.0版本之前,当我们构建Web应用的时候,Program.cs默认构建的主机类型是WebHost,在CreateWebHostBuilder()方法中通过调用WebHost静态类的CreateDefaultBuilder()方法返回一个IWebHostBuilder对象,然后调用Build()方法和Run()方法来构建主机和运行主机。

流程:获取WebHost构建器 -> 调用Build()方法生成主机实例 -> Run()方法

2.1版本

// WebAPI的Program.cs
public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }
        /// <summary>
        /// 生成Web应用主机
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                   .UseStartup<Startup>());                
    }

 

2. 泛型Host(范围:3.0版本之后)官网

3.0以后微软将主机类型替换为了Host通用主机,通过在CreatHostBuilder()中调用Host.reateDefaultBuilder()方法返回一个IHostBuilder对象,然后调用Build()方法和Run()方法来构建主机和运行主机。

在3.0版本,微软对Host进行了升级,原本Host只能用于非HTTP负载,但是通过调用ConfigureWebHostDefaults()拓展方法来实现HTTP负载。

在6.0版本,微软对于netcore进行了大升级,Program.cs文件发生了很大的改变,所以下方将会分为2个部分来分别介绍3.0版本到5.0版本的泛型Host是如何创建的?6.0版本的泛型Host是如何创建的?

3.0版本到5.0版本的的创建泛型Host

流程:获取IHostBuilder-> 调用ConfigureWebHostDefaults()方法来拓展WebHostweb应用需要调用此拓展方法,非web应用,如WokerService则不需要) -> 调用Build()方法生成主机实例 -> Run()方法

5.0版本

// WebAPI的Program.cs文件
public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }
    /// <summary>
    /// 生成通用主机
    /// </summary>
    /// <param name="args"></param>
    /// <returns></returns>
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            // 因为是WebAPI,所以要调用此拓展服务,配置WebAPI的配置,如中间件、服务等。
            // 使用拓展方法UseStartup()指向Startup文件
            // 官方描述:用于托管Web应用程序的默认值配置 
            .ConfigureWebHostDefaults(Builder =>
            {
                Builder.UseStartup<Startup>();
            });
}

 

ConfigureWebHostDefaults()拓展方法:

原本Host是不支持HTTP工作负载的,所以要使用此拓展方法可以配置主机所需要的Web服务。

调用这个方法会将WebHost注入到Host中。

简单来说,如果你的版本是3.0到5.0,且需要web服务,如MVC或者WebAPI则需要配置此服务。

(创造项目的时候会自动生成的,所以了解一下这个拓展方法是干什么的就好了)

ConfigureWebHostDefaults拓展方法源码

namespace Microsoft.Extensions.Hosting
{
    // 用于托管 Web 应用程序的默认值配置 Microsoft.Extensions.Hosting.IHostBuilder
    // 这应该在应用程序特定的配置之前调用,以避免它覆盖提供的服务、配置源、环境、内容根等
    public static class GenericHostBuilderExtensions
    {
        public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder,         Action<IWebHostBuilder> configure);
    }​
}

6.0版本的的创建泛型Host

6.0版本,NetCore使用最小托管模型来创建应用,只需要4行代码就能构建一个应用

关于WebApplication与Host请查看应用

通过使用WebApplication.CreateBuilder(args)来创建主机

最小托管模型

// 得到应用构造器:WebApplicationBuilder
var builder = WebApplication.CreateBuilder(args);
// 配置日志
builder.Logging.AddLog4Net("ConfigFile/log4net.config");
// 得到应用:WebApplication
var app = builder.Build();
// 配置中间件
app.UseStaticFiles();
// 运行主机
app.Run();

 

3. 为什么要用泛型Host替换WebHost:

参考stackoverflow的回答

泛型Host在2.1版本就已经存在了,当时只是用于非Http请求的工作负载,而WebHost 构建器更多地与 HTTP 请求相关联并且适用于 Web 应用,随着微服务和Docker的发展和出现,程序需要一个更通用的 Web 主机,因此 .NET核心团队在3.0对Host进行了改进,让Host也可也支持HTTP负载(通过拓展方法ConfigureWebHostDefaults),可以更好地将 ASP.NET Core 应用与非 Web 特定的其他服务器方案集成。简而言之就是为了在所有的netcore应用中都是用一个主机。

4. 从WebHost改为泛型Host后发生主要变化:

使用Host替换WebHost,即3.0之后的变化,主要在于依赖注入DI,在使用HostBuilder的时候,Startup.cs的构造函数只能注入以下类型:

  • IConfiguration:键值对的配置,如默认的appsetting.json文件中的配置,或者通过创建主机的时候使用Builder.AddJsonFile()方法引入的自定义json配置文件引入的json配置文件,通过这个接口可以获取配置文件的数据;

  • IHostEnvironment:提供运行应用程序的宿主环境,比如常用的IsDevelopment()方法来判断是否是运行时环境;

  • IWebHostEnvironment:提供有关运行应用程序的 Web 托管环境的信息,可以获取比如可服务应用程序的文件的绝对路径,默认是wwwroot的子文件夹;

5.代码上的流程与实际逻辑详细流程对比(泛型主机)

代码上的流程:

  1. Main方法中调用CreateHostBuilder()

  2. CreateHostBuilder()方法调用静态方法Host.CreateDefaultBuilder()方法得到IHostBuilder构造器 。

  3. 配置系统所需服务和ConfigureWebHostDefaults()

  4. 返回IHostBuilder构造器。

  5. Main方法继续调用构造器的Build()方法 -> Run()方法。

逻辑上的流程(源码):

  1. Host.CreateDefaultBuilder()方法,配置基础服务,并返回IHostBuilder构造器:

    创建一个IHostBuilder接口HostBuilder实例,根据4个方法来配置基础服务:

    1.1 ConfigureHostConfiguration()配置主机配置。

    1.2 ConfigureLogging()配置日志服务。

    1.3 ConfigureAppConfiguration()配置系统配置appsetting.json和自定义配置文件。

    1.4 UseDefaultServiceProvider()配置ServiceProvider()依赖注入容器。

  2. ConfigureWebHostDefaults()注入WebHost,配置我们自己的服务和Http负载支持:

    创建一个WebHostBuilder构造器,并调用4个方法来配置基础服务:

    2.1 UseKestrel()配置Kestrel的服务器的应用。

    2.2 UseIIS()配置对IIS进程内运行的调用,首先判断是不是windows,然后注册IISHttpServer服务,会覆盖UseKestrel()UseIISIntegration()对IIS进程外运行的调用。

    2.3 UseStart()配置对于Startup.cs文件的引用,找到后,会先找到用Startup.cs里面的ConfigureService()方法,然后使用Builder()方法调用。

    2.4 services.AddHostedService<GenericWebHostService>(),添加了一个IHostedService服务。

  3. Build()方法,生成IHost的实例,并配置相关服务然后返回IHost:

    比较重要的:

    在这里会创建依赖注入容器,并依赖注入相关服务

  4. Run()方法:

    本质上是调用的IHost.RunAsync() -> 调用的是IHost.StartAsync(),它的流程是:

    4.1 从容器中调用所有的IHostService服务,然后依次调用StartAsync()

    包括ConfigureWebHostDefaults()中的WebHostStartAsync(),包括Startup.cs里面的Configuer()方法来创建中间件。

    4.2 运行

拓展:

IHostService作用(6.0版本)

继承实现IHostService接口中的StartAsync()方法和StopAsync()方法来管理应用启动和关闭事件,当然需要在Program.cs文件中使用builder.Services.AddHostService<T>()注入主机服务才会起作用;

ApplicationStart类源码

    /// <summary>
    /// 应用启动和关闭事件,也可也继承IApplicationLifetime
    /// </summary>
    public class ApplicationStart : IHostedService
    {
        /// <summary>
        /// 应用启动
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StartAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }​
        /// <summary>
        /// 应用关闭
        /// </summary>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }

 

关于BackgroundService类(6.0版本)(后台运行服务)

BackgroundService类也是继承于IHostService,并增加了一个Task的任务属性,CancellationTokenSource取消令牌属性和ExecuteTask()方法来运行任务。通常用于WokerService服务的Woker类,同样也是需要通过builder.Services.AddHostService<T>()此方法来注入的主机服务中,以达到后台运行的目的;

 

标签:调用,WebHost,--,主机,配置,Host,方法
From: https://www.cnblogs.com/boise/p/18002730

相关文章

  • react antd 组件取值的方法
    在React中使用AntDesign(antd)组件,可以通过不同的方式获取组件的值,具体取决于所使用的AntDesign组件和其相关的API。一般来说,大部分AntDesign组件都有value属性或onChange事件,可用于获取或监听组件的值。以下是几个常见的AntDesign组件的取值方法示例:1、Input输入框组件:......
  • 用Pycharm把浏览器复制出来的headers/参数给字段和值分别加单引号
    要解决的问题:从浏览器复制出来的headers/参数样式User-Agent:Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/121.0.0.0Safari/537.36Referer: https://www.google.com.hk/ 想要在Python中能用,需要改成字典的样式,给每个......
  • 【DC渗透系列DC-2】
    arp先扫┌──(root㉿kali)-[~]└─#arp-scan-lInterface:eth0,type:EN10MB,MAC:00:0c:29:6b:ed:27,IPv4:192.168.100.251Startingarp-scan1.10.0with256hosts(https://github.com/royhills/arp-scan)192.168.100.100:50:56:c0:00:08VMware,Inc.1......
  • rpm-build
    rpm_packaging_guide:WorkingwithSPECfiles:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/rpm_packaging_guide/index#doc-wrapper示例:https://cbs.centos.org/kojifiles/packages/gnutls/3.7.6/20.el9sbase_901/data/logs/x86_......
  • 混合攻击流量对系统安全性的综合评估
    很多针对安全设备的测试仅仅针对安全设备本身的防护,比如防御的漏洞攻击行为、恶意代码是否足够多,能否抵御大流量的L23层DDoS或者应用层的DDoS攻击,却没有考虑是否防御攻击时,一并阻止了正常的业务流量。以下图为例,当为了防御DDoS攻击,限制了某个源IP地址最多只允许10个TCP连接,假如内......
  • docker安装TIDB
    1、添加docker-compose.ymlversion:'2'networks:tidb_net:driver:bridgeipam:driver:defaultconfig:-subnet:192.168.88.0/24gateway:192.168.88.1services:pd0:image:pingcap/pd:latestpor......
  • 冒泡排序法的写法
    冒泡排序法的代码如下:publicclassMyTest{publicstaticvoidmain(String[]args)throwsException{//使用冒泡排序法把数组按照升序排列int[]arr=newint[]{92,37,46,8,2};intlen=arr.length;for(inti=0;i<len-1;i++){//......
  • POCO编译报错:LNK1104 无法打开文件“libcrypto.lib”
    POCO编译报错1>LINK:fatalerrorLNK1104:无法打开文件“libcrypto.lib” 解决:1、项目  ->  属性  ->  C/C++ -> 常规 -> 附加包含目录,添加OPENSSL头文件路径C:\ProgramFiles\OpenSSL-Win64\include(OPENSSL安装路径) 2、项目  ->  属......
  • 新型生成式 AI 助手 Amazon Q(预览版)上线
    今天,我们宣布推出AmazonQ,这是一种新型的生成式人工智能助手,专门用于满足办公场景需要,可以根据客户业务进行定制。客户可以使用AmazonQ进行对话、解决问题、生成内容、获取见解并采取行动,所有这些都基于客户自身的信息存储库、代码、数据和企业系统。AmazonQ为员工提供即时......
  • 萌新的多项式学习笔记(板子)
    萌新的多项式学习笔记(板子)详细讲解FFT直接放板子structcp{ doublex,y; cp(doublexx=0,doubleyy=0){x=xx,y=yy;}};intr[maxn];cpoperator+(constcp&a,constcp&b){returncp(a.x+b.x,a.y+b.y);}cpoperator-(constcp&a,constcp&b){returncp(a.x-b.x,a......