(16)ASP.NET Core 通用主機(HostBuilder)

来源:https://www.cnblogs.com/wzk153/archive/2019/08/12/11340588.html
-Advertisement-
Play Games

1.前言 ASP.NET Core應用程式可以配置和啟動主機(Host)。主機負責應用程式啟動和生命周期管理。通用主機用於無法處理HTTP請求的應用程式。通用主機的用途是將HTTP管道從Web主機API中分離出來,從而啟用更多的主機方案。 基於通用主機的消息、後臺任務和其他非HTTP工作負載可從橫切 ...


1.前言

ASP.NET Core應用程式可以配置和啟動主機(Host)。主機負責應用程式啟動和生命周期管理。通用主機用於無法處理HTTP請求的應用程式。通用主機的用途是將HTTP管道從Web主機API中分離出來,從而啟用更多的主機方案。 基於通用主機的消息、後臺任務和其他非HTTP工作負載可從橫切功能(如配置、依賴關係註入[DI]和日誌記錄)中受益。通用主機是ASP.NET Core 2.1中的新增功能,不適用於Web承載方案。對於Web承載方案,請使用Web主機。通用主機將在未來版本中替換Web主機,併在HTTP和非HTTP方案中充當主要的主機API。

2.介紹

IHostedService是執行代碼的入口點。每個IHostedService實現都按照ConfigureServices中服務註冊的順序執行。主機啟動時,每個IHostedService上都會調用StartAsync,主機正常關閉時,以反向註冊順序調用StopAsync。

3.設置主機

IHostBuilder是供庫和應用程式初始化、生成和運行主機的主要組件:

public static async Task Main(string[] args)
{
    var host = new HostBuilder().Build();
    await host.RunAsync();
}

4.選項

HostOptions配置IHost的選項。

4.1關閉超時值

ShutdownTimeout設置StopAsync的超時值。預設值為5秒。Program.Main中的以下選項配置將預設值為5秒的關閉超時值增加至20秒:

var host = new HostBuilder().ConfigureServices((hostContext, services) =>
    {
        services.Configure<HostOptions>(option =>
        {
            option.ShutdownTimeout = System.TimeSpan.FromSeconds(20);
        });
    })
    .Build();

5.預設服務

在主機初始化期間註冊以下服務:
●環境 (IHostingEnvironment)
●HostBuilderContext
●配置 (IConfiguration)
●IApplicationLifetime (ApplicationLifetime)
●IHostLifetime (ConsoleLifetime)
●IHost
●選項 (AddOptions)
●日誌記錄 (AddLogging)

6.主機配置

主機配置的創建方式如下:
●調用IHostBuilder上的擴展方法以設置“內容根”和“環境”。
●從ConfigureHostConfiguration中的配置提供應用程式讀取配置。
●應用程式鍵(名稱)、內容根、環境配置方式我就不多說了,跟上一篇Web主機配置是一樣的。

6.1ConfigureHostConfiguration

ConfigureHostConfiguration使用IConfigurationBuilder來為主機創建IConfiguration。主機配置用於初始化IHostingEnvironment,以供在應用程式的構建過程中使用。可多次調用ConfigureHostConfiguration,並得到累計結果。必須在ConfigureHostConfiguration中顯式指定應用程式所需的任何配置提供自身,包括:
●文件配置(例如,來自hostsettings.json文件)。
●環境變數配置。
●命令行參數配置。
●任何其他所需的配置提供程式。
通過使用SetBasePath指定應用程式的基本路徑,然後調用其中一個文件配置提供應用程式,可以啟用主機的文件配置。示例應用使用JSON文件hostsettings.json,並調用AddJsonFile來使用文件的主機配置設置。要添加主機的環境變數配置,請在主機生成器上調用 AddEnvironmentVariables。AddEnvironmentVariables接受用戶定義的首碼(可選)。示例應用程式使用首碼PREFIX_。當系統讀取環境變數時,便會刪除首碼。配置示例應用程式的主機後,PREFIX_ENVIRONMENT的環境變數值就變成environment密鑰的主機配置值。示例HostBuilder配置使用ConfigureHostConfiguration:

var host = new HostBuilder().ConfigureHostConfiguration(configHost =>
    {
        configHost.SetBasePath(Directory.GetCurrentDirectory());
        configHost.AddJsonFile("hostsettings.json", optional: true);
        configHost.AddEnvironmentVariables(prefix: "PREFIX_");
        configHost.AddCommandLine(args);
    })

6.2ConfigureAppConfiguration

通過在IHostBuilder實現上調用ConfigureAppConfiguration創建應用程式配置。ConfigureAppConfiguration使用IConfigurationBuilder來為應用程式創建IConfiguration。可多次調用ConfigureAppConfiguration,並得到累計結果。應用程式使用上一次在一個給定鍵上設置值的選項。HostBuilderContext.Configuration中提供ConfigureAppConfiguration創建的配置,以供進行後續操作和在Services中使用。應用程式配置會自動接收ConfigureHostConfiguration提供的主機配置。示例應用配置使用ConfigureAppConfiguration:

var host = new HostBuilder().ConfigureAppConfiguration((hostContext, configApp) =>
    {
        configApp.SetBasePath(Directory.GetCurrentDirectory());
        configApp.AddJsonFile("appsettings.json", optional: true);
        configApp.AddJsonFile(
            $"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json",
            optional: true);
        configApp.AddEnvironmentVariables(prefix: "PREFIX_");
        configApp.AddCommandLine(args);
    })

6.3ConfigureServices

ConfigureServices將服務添加到應用程式的依賴關係註入容器。可多次調用ConfigureServices,並得到累計結果。托管服務是一個類,具有實現IHostedService介面的後臺任務邏輯。示例應用程式使用AddHostedService擴展方法向自身添加生命周期事件 LifetimeEventsHostedService和定時後臺任務TimedHostedService服務:

var host = new HostBuilder()
    .ConfigureServices((hostContext, services) =>
    {
        if (hostContext.HostingEnvironment.IsDevelopment())
        {
            // Development service configuration
        }
        else
        {
            // Non-development service configuration
        }
        services.AddHostedService<LifetimeEventsHostedService>();
        services.AddHostedService<TimedHostedService>();
})

6.4ConfigureLogging

ConfigureLogging添加了一個委托來配置提供的ILoggingBuilder。可以利用相加結果多次調用 ConfigureLogging。

var host = new HostBuilder().ConfigureLogging((hostContext, configLogging) =>
    {
        configLogging.AddConsole();
        configLogging.AddDebug();
    })
6.4.1UseConsoleLifetime

UseConsoleLifetime偵聽Ctrl+C/SIGINT或SIGTERM並調用StopApplication來啟動關閉進程。UseConsoleLifetime解除阻止RunAsync和WaitForShutdownAsync等擴展。ConsoleLifetime預註冊為預設生命周期實現,使用註冊的最後一個生命周期。

var host = new HostBuilder().UseConsoleLifetime()

7.容器配置

主機可以接受IServiceProviderFactory<TContainerBuilder>。提供工廠不屬於DI容器註冊,而是用於創建具體DI容器的主機內部函數。UseServiceProviderFactory(IServiceProviderFactory<TContainerBuilder>)重寫用於創建應用程式的服務提供程式的預設工廠。ConfigureContainer方法托管自定義容器配置。ConfigureContainer提供在基礎主機API的基礎之上配置容器的強類型體驗。可以利用相加結果多次調用ConfigureContainer。

為應用程式創建服務容器並提供服務容器工廠:

public class GenericHostSample
{
    internal class ServiceContainerFactory : IServiceProviderFactory<ServiceContainer>
    {
        public ServiceContainer CreateBuilder(IServiceCollection services)
        {
            return new ServiceContainer();
        }
        public IServiceProvider CreateServiceProvider(ServiceContainer containerBuilder)
        {
            throw new NotImplementedException();
        }
    }
}

使用該工廠併為應用程式配置自定義服務容器:

var host = new HostBuilder().UseServiceProviderFactory<ServiceContainer>(new ServiceContainerFactory())
    .ConfigureContainer<ServiceContainer>((hostContext, container) =>{
})

8.擴展性

在IHostBuilder上使用擴展方法實現主機擴展性。應用程式建立UseHostedService擴展方法,以註冊在T中傳遞的托管服務:

public static class Extensions
{
    public static IHostBuilder UseHostedService<T>(this IHostBuilder hostBuilder)
        where T : class, IHostedService, IDisposable
    {
        return hostBuilder.ConfigureServices(services =>
            services.AddHostedService<T>());
    }
}

9.管理主機

IHost實現負責啟動和停止由服務容器中註冊的IHostedService實現。

9.1Run

Run運行應用程式並阻止調用線程,直到關閉主機:

public class Program
{
    public void Main(string[] args)
    {
        var host = new HostBuilder().Build();
        host.Run();
    }
}

9.2RunAsync

RunAsync運行應用程式並返回在觸發取消令牌或關閉時完成的Task:

public class Program
{
    public static async Task Main(string[] args)
    {
        var host = new HostBuilder().Build();
        await host.RunAsync();
    }
}

9.3RunConsoleAsync

RunConsoleAsync啟用控制台、生成和啟動主機,以及等待Ctrl+C/SIGINT或SIGTERM關閉。

public class Program
{
    public static async Task Main(string[] args)
    {
        var hostBuilder = new HostBuilder();
        await hostBuilder.RunConsoleAsync();
    }
}

9.4Start和StopAsync

Start同步啟動主機。StopAsync嘗試在提供的超時時間內停止主機。

public class Program
{
    public static async Task Main(string[] args)
    {
        var host = new HostBuilder().Build();
        using (host)
        {
            host.Start();
            await host.StopAsync(TimeSpan.FromSeconds(5));
        }
    }
}

9.5StartAsync和StopAsync

StartAsync啟動應用程式。StopAsync停止應用程式。

public class Program
{
    public static async Task Main(string[] args)
    {
        var host = new HostBuilder().Build();
        using (host)
        {
            await host.StartAsync();
            await host.StopAsync();
        }
    }
}

9.6WaitForShutdown

WaitForShutdown通過IHostLifetime觸發,例如ConsoleLifetime(偵聽Ctrl+C/SIGINT或SIGTERM)。WaitForShutdown調用StopAsync。

public class Program
{
    public void Main(string[] args)
    {
        var host = new HostBuilder().Build();
        using (host)
        {
            host.Start();
            host.WaitForShutdown();
        }
    }
}

9.7WaitForShutdownAsync

WaitForShutdownAsync返回在通過給定的令牌和調用StopAsync來觸發關閉時完成的Task。

public class Program
{
    public static async Task Main(string[] args)
    {
        var host = new HostBuilder().Build();
        using (host)
        {
            await host.StartAsync();
            await host.WaitForShutdownAsync();
        }
    }
}

9.8External control(外部控制項)

public class Program
{
    private IHost _host;
    public Program()
    {
        _host = new HostBuilder()
            .Build();
    }
    public async Task StartAsync()
    {
        _host.StartAsync();
    }
    public async Task StopAsync()
    {
        using (_host)
        {
            await _host.StopAsync(TimeSpan.FromSeconds(5));
        }
    }
}

在StartAsync開始時調用WaitForStartAsync,在繼續之前,會一直等待該操作完成。它可用於延遲啟動,直到外部事件發出信號。

10.IHostingEnvironment、IApplicationLifetime介面

該兩個介面類型跟上一篇Web主機IHostingEnvironment、IApplicationLifetime介面類型是一樣的,詳情就不在這多講了,想要瞭解的請移步到上一篇Web主機文章。

參考文獻:
ASP.NET Core 通用主機


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GitHub登錄 分析登錄頁面 開發者工具分析請求 從session請求分析得知: 1.請求的URL為:https://github.com/session 2.該請求為post請求,即需要上傳data表單,所以我們需要分析form-data 由form-data分析得知: 1.login:GitH ...
  • 伺服器數量過多,每次採用ip+埠 輸入密碼的方式登錄比較繁瑣,就採用了免密碼和埠登錄。 普通登錄方式: ssh p 27479 [email protected] 更換免密碼登錄: 本地操作: 本地的公鑰位置: ~/.ssh/id_rsa.pub ~/.ssh目錄下創建一個config文件, ...
  • 廣告檢索服務 功能介紹 媒體方(手機APP打開的展示廣告,走在路上看到的大屏幕廣告等等) 請求數據對象實現 從上圖我們可以看出,在媒體方向我們的廣告檢索系統發起請求的時候,請求中會有很多的請求參數信息,他們分為了三個部分,我們來編碼封裝這幾個參數對象信息以及我們請求本身的信息。Let's code. ...
  • Filter 過濾器 概念:當訪問伺服器的某些資源時,過濾器可以將請求先進行攔截,在完成了一定的特殊功能後,可以讓此請求繼續執行。 一. 實現步驟 1、實現Filter介面 2、重寫方法 3、配置web.xml 二. 過濾器的url配置 完全匹配:攔截指定資源 擴展名匹配: .擴展名,攔截指定尾碼的 ...
  • xl_echo編輯整理,歡迎轉載,轉載請聲明文章來源。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!! 參考文章列表: "Java併發編程:Synchronized底層優化(偏向鎖、輕量級鎖)" "輕量級鎖 ...
  • 以連接mysql資料庫為例 一 安裝組件 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Relational Microsoft.EntityFrameworkCore.Tools MySqlConnector Pomelo. ...
  • 1.業務場景:用戶登錄,收到消息通知,審批業務,根據配置的流程繼續流轉,最終審核發送回給申請人(終審同意結束,終審不同意申請人可以繼續修改提交)。 2.思路過程: 3..資料庫設計: 4.代碼過程: ...
  • 上接(abp(net core)+easyui+efcore實現倉儲管理系統——使用 WEBAPI實現CURD (十二)),在這一篇文章中我們創建視圖模型、列表視圖、添加菜單。 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...