• .NET 云原生架构师训练营(模块二 基础巩固 Host)--学习笔记


    2.2.4 核心模块--Host

    • 什么是 Host
    • Host 的默认配置做了哪些事情
    • 框架提供的服务
    • HostedService 后台服务

    ASP.NET Core Web 主机:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/web-host?view=aspnetcore-5.0

    什么是 Host

    主机是封装应用资源的对象,例如:

    • 依赖关系注入(DI)
    • Logging
    • Configuration
    • IHostedService 实现

    对应 Program.cs 中的 host.Run();

    可以在主机启动前通过 CreateHostBuilder 进行配置

    Host 的默认配置做了哪些事情

    CreateHostBuilder 方法

    • 将内容根目录设置为由 GetCurrentDirectory 返回的路径
    • 加载主机配置(前缀为 DOTNET_ 的环境变量;命令行参数)
    • 加载应用配置(appsettings.json; appsettings.{Environment}.json; 密钥管理器;环境变量;命令行参数)
    • 添加日志记录程序(控制台;调试;EventSource;EventLog)
    • 当环境为”开发“时,启用范围验证和依赖关系验证
    • ConfigureWebHostDefaults(asp.net core 需要)
    // 内容根目录
    var root = hostingContext.HostingEnvironment.ContentRootPath;
    
    // 环境
    var envName = hostingContext.HostingEnvironment.EnvironmentName;
    

    ConfigureWebHostDefaults 方法

    • 从前缀为 ASPNETCORE_ 的环境变量加载主机配置
    • 使用应用的托管配置提供程序将 Kestrel 服务器设置为 web 服务器并对其进行配置
    • 添加主机筛选中间件
    • 如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 等于 true,则添加转接头中间件
    • 支持 IIS 集成

    框架提供的服务

    • IHostApplicationLifetime
    • IHostLifetime
    • IHostEnvironment / IWebHostEnvironment

    IHostApplicationLifetime

    Program.cs

    var applicationLifetime = host.Services.GetRequiredService<IHostApplicationLifetime>();
    
    applicationLifetime.ApplicationStarted.Register((() =>
    {
        Console.WriteLine("Application Started");
    }));
    
    applicationLifetime.ApplicationStopping.Register((() =>
    {
        Console.WriteLine("Application Stopping");
    }));
    
    applicationLifetime.ApplicationStopped.Register((() =>
    {
        Console.WriteLine("Application Stopped");
    }));
    

    用于监控 Host 主机的启动,停止

    IHostLifetime

    同样的监听

    IHostEnvironment / IWebHostEnvironment

    将 IHostEnvironment 服务注册到一个类,获取以下设置的信息

    • ApplicationName
    • EnvironmentName
    • ContentRootPath

    HostedService 后台服务

    新建 MyHostedService.cs

    namespace HelloApi.Services
    {
        public class MyHostedService : IHostedService
        {
            public Task StartAsync(CancellationToken cancellationToken)
            {
                throw new NotImplementedException();
            }
    
            public Task StopAsync(CancellationToken cancellationToken)
            {
                throw new NotImplementedException();
            }
        }
    }
    

    在 IHostedService 的基础之上,asp .net core 还提供了另一个封装 BackgroundService

    public class MyBackgroundService : BackgroundService
    {
        protected override Task ExecuteAsync(CancellationToken stoppingToken)
        {
            throw new NotImplementedException();
        }
    }
    

    在 StopAsync 之前会通过 CancellationToken 通知,执行一些操作

    public class MyBackgroundService : BackgroundService
    {
        private readonly ILogger<MyBackgroundService> _logger;
    
        public MyBackgroundService(ILogger<MyBackgroundService> logger)
        {
            _logger = logger;
        }
    
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            // 只要不停止就一直执行
            while (!stoppingToken.IsCancellationRequested)
            {
                _logger.LogInformation("date:{0}", DateTime.Now);
                await Task.Delay(1000, stoppingToken);
            }
        }
    }
    

    在 Startup.cs 中注入

    services.AddHostedService<MyBackgroundService>();
    

    启动程序,控制台不断输出时间

    请求接口也可以正常访问

    asp .net core 通过这样一种 HostedService 的方式将后台常驻服务与 web api 的请求同时放到一个托管基类

    GitHub源码链接:

    https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/HelloApi

    知识共享许可协议

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

  • 相关阅读:
    特征选择方法之信息增益
    6 个优秀的开源 OCR 光学字符识别工具
    Python中type与Object的区别
    Python type类具体的三大分类:metaclasses,classes,instance
    如何去除List中的重复值?
    type,isinstance判断一个变量的数据类型
    Python图形界面开发包 PyGTK
    python使用easygui写图形界面程序
    opencv-python 学习笔记2:实现目光跟随(又叫人脸跟随)
    Tomcat全攻略
  • 原文地址:https://www.cnblogs.com/MingsonZheng/p/14152295.html
Copyright © 2020-2023  润新知