您現在的位置是:首頁 > 單機遊戲首頁單機遊戲

ASP.NET Core 中的 .NET 通用主機

簡介鍵:detailedErrors型別:bool(true 或 1)預設 :false環境變數 :_DETAILEDERRORS要設定此值,使用配置或呼叫 UseSetting:webBuilder

怎麼解除令牌

ASP。NET Core 模板會建立一個 。NET Core 泛型主機 (HostBuilder)。

本主題介紹如何使用 ASP。NET Core 中的 。NET 通用主機。

主機定義

主機是封裝應用資源的物件,例如:

依賴關係注入 (DI)

Logging

Configuration

IHostedService 實現

當主機啟動時,它將對在託管服務的服務容器集合中註冊的 IHostedService 的每個實現呼叫 IHostedService。StartAsync。 在 web 應用中,其中一個 IHostedService 實現是啟動 HTTP 伺服器實現的 web 服務。

一個物件中包含所有應用的相互依賴資源的主要原因是生存期管理:控制應用啟動和正常關閉。

設定主機

主機通常由 Program 類中的程式碼配置、生成和執行。 Main 方法:

呼叫 CreateHostBuilder 方法以建立和配置生成器物件。

對生成器物件呼叫 Build 和 Run 方法。

ASP。NET Core Web 模板會生成以下程式碼來建立一個主機:

public class Program{ public static void Main(string[] args) { CreateHostBuilder(args)。Build()。Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host。CreateDefaultBuilder(args) 。ConfigureWebHostDefaults(webBuilder => { webBuilder。UseStartup(); });}

以下程式碼會使用新增到 DI 容器中的 IHostedService 實現建立一個非 HTTP 工作負載。

public class Program{ public static void Main(string[] args) { CreateHostBuilder(args)。Build()。Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host。CreateDefaultBuilder(args) 。ConfigureServices((hostContext, services) => { services。AddHostedService(); });}

對於 HTTP 工作負荷,Main 方法相同,但 CreateHostBuilder 呼叫 ConfigureWebHostDefaults:

public static IHostBuilder CreateHostBuilder(string[] args) => Host。CreateDefaultBuilder(args) 。ConfigureWebHostDefaults(webBuilder => { webBuilder。UseStartup(); });

如果應用使用 Entity Framework Core,不要更改 CreateHostBuilder 方法的名稱或簽名。 Entity Framework Core 工具應查詢一個無需執行應用即可配置主機的 CreateHostBuilder 方法。 有關詳細資訊,請參閱設計時 DbContext 建立。

預設生成器設定

CreateDefaultBuilder 方法:

將內容根目錄設定為由 GetCurrentDirectory 返回的路徑。

透過以下項載入主機配置:

字首為 DOTNET_ 的環境變數。

命令列引數。

透過以下物件載入應用配置:

appsettings。json

appsettings。{Environment}。json。

金鑰管理器 當應用在 Development 環境中執行時。

環境變數。

命令列引數。

新增以下日誌記錄提供程式:

控制檯

除錯

EventSource

EventLog(僅當在 Windows 上執行時)

當環境為“開發”時,啟用範圍驗證和依賴關係驗證。

ConfigureWebHostDefaults 方法:

從字首為 ASPNETCORE_ 的環境變數載入主機配置。

使用應用的託管配置提供程式將 Kestrel 伺服器設定為 web 伺服器並對其進行配置。 有關 Kestrel 伺服器預設選項,請參閱 ASP。NET Core 中的 Kestrel Web 伺服器實現。

新增主機篩選中介軟體。

如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 等於 true,則新增轉接頭中介軟體。

支援 IIS 整合。 有關 IIS 預設選項,請參閱 使用 IIS 在 Windows 上託管 ASP。NET Core。

本文中後面的所有應用型別的設定和 web 應用的設定部分介紹如何替代預設生成器設定。

框架提供的服務

自動註冊以下服務:

IHostApplicationLifetime

IHostLifetime

IHostEnvironment / IWebHostEnvironment

有關框架提供的服務的詳細資訊,請參閱 ASP。NET Core 依賴注入。

IHostApplicationLifetime

將 IHostApplicationLifetime(以前稱為 IApplicationLifetime)服務注入任何類以處理啟動後和正常關閉任務。 介面上的三個屬性是用於註冊應用啟動和應用停止事件處理程式方法的取消令牌。 該介面還包括 StopApplication 方法。

以下示例是註冊 IHostApplicationLifetime 事件的 IHostedService 實現:

internal class LifetimeEventsHostedService : IHostedService{ private readonly ILogger _logger; private readonly IHostApplicationLifetime _appLifetime; public LifetimeEventsHostedService( ILogger logger, IHostApplicationLifetime appLifetime) { _logger = logger; _appLifetime = appLifetime; } public Task StartAsync(CancellationToken cancellationToken) { _appLifetime。ApplicationStarted。Register(OnStarted); _appLifetime。ApplicationStopping。Register(OnStopping); _appLifetime。ApplicationStopped。Register(OnStopped); return Task。CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { return Task。CompletedTask; } private void OnStarted() { _logger。LogInformation(“OnStarted has been called。”); // Perform post-startup activities here } private void OnStopping() { _logger。LogInformation(“OnStopping has been called。”); // Perform on-stopping activities here } private void OnStopped() { _logger。LogInformation(“OnStopped has been called。”); // Perform post-stopped activities here }}

IHostLifetime

IHostLifetime 實現控制主機何時啟動和何時停止。 使用了已註冊的最後一個實現。

Microsoft。Extensions。Hosting。Internal。ConsoleLifetime 是預設的 IHostLifetime 實現。 ConsoleLifetime:

偵聽 Ctrl+C/SIGINT 或 SIGTERM 並呼叫 StopApplication 來啟動關閉程序。

解除阻止 RunAsync 和 WaitForShutdownAsync 等擴充套件。

IHostEnvironment

將 IHostEnvironment 服務註冊到一個類,獲取關於以下設定的資訊:

ApplicationName

EnvironmentName

ContentRootPath

Web 應用實現 IWebHostEnvironment 介面,該介面繼承 IHostEnvironment 並新增 WebRootPath。

主機配置

主機配置用於 IHostEnvironment 實現的屬性。

主機配置可以從 ConfigureAppConfiguration 內的 HostBuilderContext。Configuration 獲取。 在 ConfigureAppConfiguration 後,HostBuilderContext。Configuration 被替換為應用配置。

若要新增主機配置,請對 IHostBuilder 呼叫 ConfigureHostConfiguration。 可多次呼叫 ConfigureHostConfiguration,並得到累計結果。 主機使用上一次在一個給定鍵上設定值的選項。

CreateDefaultBuilder 包含字首為 DOTNET_ 的環境變數提供程式和命令列引數。 對於 web 應用程式,新增字首為 ASPNETCORE_ 的環境變數提供程式。 當系統讀取環境變數時,便會刪除字首。 例如,ASPNETCORE_ENVIRONMENT 的環境變數值就變成 environment 金鑰的主機配置值。

以下示例建立主機配置:

// using Microsoft。Extensions。Configuration;Host。CreateDefaultBuilder(args) 。ConfigureHostConfiguration(configHost => { configHost。SetBasePath(Directory。GetCurrentDirectory()); configHost。AddJsonFile(“hostsettings。json”, optional: true); configHost。AddEnvironmentVariables(prefix: “PREFIX_”); configHost。AddCommandLine(args); });

應用配置

透過對 IHostBuilder 呼叫 ConfigureAppConfiguration 建立應用配置。 可多次呼叫 ConfigureAppConfiguration,並得到累計結果。 應用使用上一次在一個給定鍵上設定值的選項。

由 ConfigureAppConfiguration 建立的配置可以透過 HostBuilderContext。Configuration 獲取以用於後續操作,也可以透過 DI 作為服務獲取。 主機配置也會新增到應用配置。

有關詳細資訊,請參閱 ASP。NET Core 中的配置。

適用於所有應用型別的設定

本部分列出了適用於 HTTP 和非 HTTP 工作負荷的主機設定。 預設情況下,用來配置這些設定的環境變數可以具有 DOTNET_ 或 ASPNETCORE_ 字首。 有關詳細資訊,請參閱預設生成器設定部分。

ApplicationName

IHostEnvironment。ApplicationName 屬性是在主機構造期間透過主機配置設定的。

鍵:applicationName

型別:string

預設 :包含應用入口點的程式集的名稱。

環境變數 :APPLICATIONNAME

要設定此值,請使用環境變數。

ContentRoot

IHostEnvironment。ContentRootPath 屬性決定主機從什麼位置開始搜尋內容檔案。 如果路徑不存在,主機將無法啟動。

鍵:contentRoot

型別:string

預設 :應用程式集所在的資料夾。

環境變數 :CONTENTROOT

若要設定此值,請使用環境變數或對 IHostBuilder 呼叫 UseContentRoot:

Host。CreateDefaultBuilder(args) 。UseContentRoot(“c:\\content-root”) //。。。

有關詳情,請參閱:

基礎知識:內容根目錄

WebRoot

EnvironmentName

IHostEnvironment。EnvironmentName 屬性可以設定為任何值。 框架定義的值包括 Development``Staging 和 Production。 值不區分大小寫。

鍵:environment

型別:string

預設 :Production

環境變數 :ENVIRONMENT

若要設定此值,請使用環境變數或對 IHostBuilder 呼叫 UseEnvironment:

Host。CreateDefaultBuilder(args) 。UseEnvironment(“Development”) //。。。

ShutdownTimeout

HostOptions。ShutdownTimeout 設定 StopAsync 的超時。 預設值為 5 秒。 在超時時間段中,主機:

觸發 IHostApplicationLifetime。ApplicationStopping。

嘗試停止託管服務,對服務停止失敗的錯誤進行日誌記錄。

如果在所有託管服務停止之前就達到了超時時間,則會在應用關閉時會終止剩餘的所有活動的服務。 即使沒有完成處理工作,服務也會停止。 如果停止服務需要額外的時間,請增加超時時間。

鍵:shutdownTimeoutSeconds

型別:int

預設 :5 秒

環境變數 :SHUTDOWNTIMEOUTSECONDS

若要設定此值,請使用環境變數或配置 HostOptions。 以下示例將超時設定為 20 秒:

Host。CreateDefaultBuilder(args) 。ConfigureServices((hostContext, services) => { services。Configure(option => { option。ShutdownTimeout = System。TimeSpan。FromSeconds(20); }); });

禁用“在更改時過載應用配置”

預設情況下,appsettings。json 和 appsettings。{Environment}。json 會在檔案更改時過載。 若要在 ASP。NET Core 5。0 或更高版本中禁用此過載行為,請將 hostBuilder:reloadConfigOnChange 鍵設定為 false。

鍵:hostBuilder:reloadConfigOnChange

型別:bool(true 或 1)

預設 :true

命令列引數:hostBuilder:reloadConfigOnChange

環境變數 :hostBuilder:reloadConfigOnChange

警告

所有平臺上的環境變數分層鍵都不支援冒號 (:) 分隔符。 有關詳細資訊,請參閱環境變數。

適用於 Web 應用的設定

一些主機設定僅適用於 HTTP 工作負荷。 預設情況下,用來配置這些設定的環境變數可以具有 DOTNET_ 或 ASPNETCORE_ 字首。

IWebHostBuilder 上的擴充套件方法適用於這些設定。 顯示如何呼叫擴充套件方法的示例程式碼假定 webBuilder 是 IWebHostBuilder 的例項,如以下示例所示:

public static IHostBuilder CreateHostBuilder(string[] args) => Host。CreateDefaultBuilder(args) 。ConfigureWebHostDefaults(webBuilder => { webBuilder。CaptureStartupErrors(true); webBuilder。UseStartup(); });

CaptureStartupErrors

當 false 時,啟動期間出錯導致主機退出。 當 true 時,主機在啟動期間捕獲異常並嘗試啟動伺服器。

鍵:captureStartupErrors

型別:bool(true 或 1)

預設 :預設為 false,除非應用使用 Kestrel 在 IIS 後方執行,其中預設值是 true。

環境變數 :CAPTURESTARTUPERRORS

若要設定此值,使用配置或呼叫 CaptureStartupErrors:

webBuilder。CaptureStartupErrors(true);

DetailedErrors

如果啟用,或環境為 Development,應用會捕獲詳細錯誤。

鍵:detailedErrors

型別:bool(true 或 1)

預設 :false

環境變數 :_DETAILEDERRORS

要設定此值,使用配置或呼叫 UseSetting:

webBuilder。UseSetting(WebHostDefaults。DetailedErrorsKey, “true”);

HostingStartupAssemblies

承載啟動程式集的以分號分隔的字串在啟動時載入。 雖然配置值預設為空字串,但是承載啟動程式集會始終包含應用的程式集。 提供承載啟動程式集時,當應用在啟動過程中生成其公用服務時將它們新增到應用的程式集載入。

鍵:hostingStartupAssemblies

型別:string

預設 :空字串

環境變數 :_HOSTINGSTARTUPASSEMBLIES

要設定此值,使用配置或呼叫 UseSetting:

webBuilder。UseSetting(WebHostDefaults。HostingStartupAssembliesKey, “assembly1;assembly2”);

HostingStartupExcludeAssemblies

承載啟動程式集的以分號分隔的字串在啟動時排除。

鍵:hostingStartupExcludeAssemblies

型別:string

預設 :空字串

環境變數 :_HOSTINGSTARTUPEXCLUDEASSEMBLIES

要設定此值,使用配置或呼叫 UseSetting:

webBuilder。UseSetting(WebHostDefaults。HostingStartupExcludeAssembliesKey, “assembly1;assembly2”);

HTTPS_Port

HTTPS 重定向埠。 用於強制實施 HTTPS。

鍵:https_port

型別:string

預設 :未設定預設值。

環境變數 :HTTPS_PORT

要設定此值,使用配置或呼叫 UseSetting:

webBuilder。UseSetting(“https_port”, “8080”);

PreferHostingUrls

指示主機是否應該偵聽使用 IWebHostBuilder 配置的 URL,而不是使用 IServer 實現配置的 URL。

鍵:preferHostingUrls

型別:bool(true 或 1)

預設 :true

環境變數 :_PREFERHOSTINGURLS

若要設定此值,請使用環境變數或呼叫 PreferHostingUrls:

webBuilder。PreferHostingUrls(false);

PreventHostingStartup

阻止承載啟動程式集自動載入,包括應用的程式集所配置的承載啟動程式集。 有關詳細資訊,請參閱 在 ASP。NET Core 中使用承載啟動程式集。

鍵:preventHostingStartup

型別:bool(true 或 1)

預設 :false

環境變數 :_PREVENTHOSTINGSTARTUP

若要設定此值,請使用環境變數或呼叫 UseSetting:

webBuilder。UseSetting(WebHostDefaults。PreventHostingStartupKey, “true”);

StartupAssembly

要搜尋 Startup 類的程式集。

鍵:startupAssembly

型別:string

預設 :應用的程式集

環境變數 :STARTUPASSEMBLY

若要設定此值,請使用環境變數或呼叫 UseStartup。 UseStartup 可以採用程式集名稱 (string) 或型別 (TStartup)。 如果呼叫多個 UseStartup 方法,優先選擇最後一個方法。

webBuilder。UseStartup(“StartupAssemblyName”);

webBuilder。UseStartup();

URL

IP 地址或主機地址的分號分隔列表,其中包含伺服器應針對請求偵聽的埠和協議。 例如 http://localhost:123。 使用“*”指示伺服器應針對請求偵聽的使用特定埠和協議(例如 http://*:5000)的 IP 地址或主機名。 協議(http:// 或 https://)必須包含每個 URL。 不同的伺服器支援的格式有所不同。

鍵:urls

型別:string

預設值 :http://localhost:5000 和 https://localhost:5001

環境變數 :URLS

若要設定此值,請使用環境變數或呼叫 UseUrls:

webBuilder。UseUrls(“http://*:5000;http://localhost:5001;https://hostname:5002”);

Kestrel 具有自己的終結點配置 API。 有關詳細資訊,請參閱 ASP。NET Core 中的 Kestrel Web 伺服器實現。

WebRoot

IWebHostEnvironment。WebRootPath 屬性可確定應用靜態資產的相對路徑。 如果該路徑不存在,則使用無操作檔案提供程式。

鍵:webroot

型別:string

預設 :預設值為 wwwroot。 {content root}/wwwroot 的路徑必須存在。

環境變數 :WEBROOT

若要設定此值,請使用環境變數或對 IWebHostBuilder 呼叫 UseWebRoot:

webBuilder。UseWebRoot(“public”);

有關詳情,請參閱:

基礎知識:Web 根目錄

ContentRoot

管理主機生存期

對生成的 IHost 實現呼叫方法,以啟動和停止應用。 這些方法會影響所有在服務容器中註冊的 IHostedService 實現。

執行

Run 執行應用並阻止呼叫執行緒,直到關閉主機。

RunAsync

RunAsync 執行應用並返回在觸發取消令牌或關閉時完成的 Task。

RunConsoleAsync

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

Start

Start 同步啟動主機。

StartAsync

StartAsync 啟動主機並返回在觸發取消令牌或關閉時完成的 Task。

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

StopAsync

StopAsync 嘗試在提供的超時時間內停止主機。

WaitForShutdown

WaitForShutdown 阻止呼叫執行緒,直到 IHostLifetime 觸發關閉,例如透過 Ctrl+C/SIGINT 或 SIGTERM。

WaitForShutdownAsync

WaitForShutdownAsync 返回在透過給定的令牌和呼叫 StopAsync 來觸發關閉時完成的 Task。

外部控制元件

使用可從外部呼叫的方法,能夠實現對主機生存期的直接控制:

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)); } }}

Top