(15)ASP.NET Core Web主機(IWebHostBuilder)

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

1.前言 ASP.NET Core應用程式可以配置和啟動主機(Host)。主機負責應用程式啟動和生存期管理,配置伺服器和請求處理管道。主機還可以設置日誌記錄、依賴關係註入和配置。而host主機又包括Web主機(IWebHostBuilder)和通用主機(IHostBuilder)。該章節主要介紹了用 ...


1.前言

ASP.NET Core應用程式可以配置和啟動主機(Host)。主機負責應用程式啟動和生存期管理,配置伺服器和請求處理管道。主機還可以設置日誌記錄、依賴關係註入和配置。而host主機又包括Web主機(IWebHostBuilder)和通用主機(IHostBuilder)。該章節主要介紹了用於托管Web應用的Web主機。對於其他類型的應用,請使用通用主機。

2.設置主機

創建使用IWebHostBuilder實例的主機。通常在應用程式的入口點來執行Main方法。在項目模板中,Main位於Program.cs。典型應用預設調用CreateDefaultBuilder來開始創建主機:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }
    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

2.1執行下列任務

調用CreateDefaultBuilder的代碼位於名為CreateWebHostBuilder的方法中,這讓它區分於 Main中對生成器對象調用Run的代碼。CreateDefaultBuilder執行下列任務:
●使用應用程式的托管配置提供應用程式將Kestrel伺服器配置為Web伺服器。
●將內容根設置為由 Directory.GetCurrentDirectory返回的路徑。
●通過以下對象載入主機配置:
  ○首碼為ASPNETCORE_的環境變數(例如,ASPNETCORE_ENVIRONMENT)。
  ○命令行參數。
●按以下順序載入應用程式配置:
  ○appsettings.json。
  ○appsettings.{Environment}.json。
  ○應用在使用入口程式集的Development環境中運行時的機密管理器。
  ○環境變數。
  ○命令行參數。
●配置控制台和調試輸出的日誌記錄。日誌記錄包含appsettings.json或appsettings.{Environment}.json文件的日誌記錄配置部分中指定的日誌篩選規則。
●使用ASP.NET Core模塊在IIS後面運行時,CreateDefaultBuilder會啟用IIS集成,這會配置應用程式的基址和埠。IIS集成還配置應用程式以捕獲啟動錯誤。
●如果應用環境為“開發(Development)”,請將ServiceProviderOptions.ValidateScopes設為true。

2.2重寫和增強定義的配置

ConfigureAppConfiguration、ConfigureLogging以及IWebHostBuilder的其他方法和擴展方法可重寫和增強CreateDefaultBuilder定義的配置。下麵是一些示例:
ConfigureAppConfiguration:用於指定應用的其他IConfiguration。下麵的ConfigureAppConfiguration調用添加委托,以在appsettings.xml文件中添加應用配置,該示例在Core系列第11章節有演示。可多次調用ConfigureAppConfiguration。請註意,此配置不適用於主機(例如,伺服器URL或環境)。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        config.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true);
});

ConfigureLogging:ConfigureLogging調用添加委托,將最小日誌記錄級別 (SetMinimumLevel)配置為LogLevel.Warning。此設置重寫CreateDefaultBuilder在appsettings.Development.json和appsettings.Production.json中配置,分別為LogLevel.Debug和LogLevel.Error。可多次調用 ConfigureLogging。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
    .ConfigureLogging(logging =>
    {
        logging.SetMinimumLevel(LogLevel.Warning);
});

ConfigureKestrel:調用ConfigureKestrel來重寫CreateDefaultBuilder在配置Kestrel時建立的30,000,000位元組預設Limits.MaxRequestBodySize:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
    .ConfigureKestrel((context, options) =>
    {
        options.Limits.MaxRequestBodySize = 20000000;
});

設置主機時,可以提供配置和ConfigureServices方法。如果指定Startup類,必須定義Configure方法。

3.主機配置值

WebHostBuilder依賴於以下的方法設置主機配置值:
●主機生成器配置,其中包括格式ASPNETCORE_{configurationKey}的環境變數。例如 ASPNETCORE_ENVIRONMENT。
●UseContentRoot和UseConfiguration等擴展。
●UseSetting和關聯鍵。使用UseSetting設置值時,該值設置為無論何種類型的字元串。

3.1應用程式鍵(名稱)

在主機構造期間調用UseStartup或Configure時,會自動設置 IHostingEnvironment.ApplicationName屬性。該值設置為包含應用入口點的程式集的名稱。要顯式設置值,請使用WebHostDefaults.ApplicationKey(環境變數:ASPNETCORE_APPLICATIONNAME):

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //應用程式預設名稱為:CoreWeb (也就是項目名稱)
  string an = env.ApplicationName;
  ...
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args).UseStartup<Startup>() .UseSetting(WebHostDefaults.ApplicationKey, "CoreWeb");

3.2捕獲啟動錯誤

此設置控制啟動錯誤的捕獲。當false時,啟動期間出錯導致主機退出。當true時,主機在啟動期間捕獲異常並嘗試啟動伺服器(環境變數:ASPNETCORE_CAPTURESTARTUPERRORS)。

WebHost.CreateDefaultBuilder(args)
    .CaptureStartupErrors(true)

3.3內容根

此設置確定ASP.NET Core開始搜索內容文件,如MVC視圖等。內容根也用作Web根設置的基路徑。如果路徑不存在,主機將無法啟動(環境變數:ASPNETCORE_CONTENTROOT)。

WebHost.CreateDefaultBuilder(args)
    .UseContentRoot("c:\\<content-root>")

3.4詳細錯誤

確定是否應捕獲詳細錯誤。啟用(或當環境設置為Development)時,應用捕獲詳細的異常(環境變數:ASPNETCORE_DETAILEDERRORS)。

WebHost.CreateDefaultBuilder(args)
    .UseSetting(WebHostDefaults.DetailedErrorsKey, "true")

3.5環境

設置應用程式的環境。環境可以設置為任何值。框架定義的值包括Development、Staging和Production。值不區分大小寫。預設情況下,從ASPNETCORE_ENVIRONMENT環境變數讀取環境。使用Visual Studio時,可能會在launchSettings.json文件中設置環境變數。有關於環境詳情信息,可以移步到Core系列第10章節有參閱(環境變數:ASPNETCORE_ENVIRONMENT)。

WebHost.CreateDefaultBuilder(args)
    .UseEnvironment(EnvironmentName.Development)

3.6HTTPS埠

設置HTTPS重定向埠。用於強制實施HTTPS(環境變數:ASPNETCORE_HTTPS_PORT)。

WebHost.CreateDefaultBuilder(args)
    .UseSetting("https_port", "8080")

3.7伺服器(Kestrel) URL

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

WebHost.CreateDefaultBuilder(args)
    .UseUrls("https://*:5000;https://localhost:5001;https://hostname:5002")

4.重寫配置

使用配置可以配置Web主機。在下麵的示例中,主機配置是根據需要在hostsettings.json文件中指定。命令行參數可能會重寫從hostsettings.json文件載入的任何配置。生成的配置(在config中)用於通過UseConfiguration配置主機。
新建一個hostsettings.json文件,內容如下:

{
  "urls": "https://*:5005"
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    //IConfigurationBuilder的配置主機
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        //主機配置在hostsettings.json文件中指定
        .AddJsonFile("hostsettings.json", optional: true)
        //輸入的命令行參數可能會重寫從hostsettings.json文件載入的任何配置
        .AddCommandLine(args)
        .Build();

    return WebHost.CreateDefaultBuilder(args)
        .UseUrls("https://*:5001")
        .UseConfiguration(config)
        .Configure(app =>
        {
            //生成的配置委托函數
            app.Run(context =>
                context.Response.WriteAsync("Hello, World!"));
        });
}

上述代碼描述意思是若要指定在特定的URL上運行的主機,所需的值可以在執行dotnet運行時從命令提示符傳入。命令行參數重寫hostsettings.json文件中的urls值,且伺服器偵聽埠8080:

dotnet run --urls "http://*:8080"

主機啟動時,先用hostsettings.json config重寫UseUrls提供的urls參數配置,然後再用命令行參數config重寫hostsettings.json config的urls參數配置。

5.管理主機

管理主題啟動方式有Run和Start兩種。Run方法啟動Web應用程式並阻止調用線程,直到關閉主機。Start方法通過調用自身以非阻止方式運行主機。

//Run
CreateWebHostBuilder(args).Build().Run();
//Start:非阻止方式,所有必須加上ReadLine
CreateWebHostBuilder(args).Build().Start();
Console.ReadLine();

6.IHostingEnvironment介面

IHostingEnvironment介面提供有關應用的Web承載環境的信息。使用構造函數註入獲取 IHostingEnvironment以使用其屬性和擴展方法:

//示例1:
public class CustomFileReader
{
    private readonly IHostingEnvironment _env;

    public CustomFileReader(IHostingEnvironment env)
    {
        _env = env;
    }
    public string ReadFile(string filePath)
    {
        var fileProvider = _env.WebRootFileProvider;
        // Process the file here
    }
}

可以用於在啟動時基於環境配置應用程式或者將IHostingEnvironment註入到Startup構造函數,用於ConfigureServices:

//示例2:
public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        HostingEnvironment = env;
    }
    public IHostingEnvironment HostingEnvironment { get; }
    public void ConfigureServices(IServiceCollection services)
    {
        if (HostingEnvironment.IsDevelopment())
        {
            // Development configuration
        }
        else
        {
            // Staging/Production configuration
        }
        var contentRootPath = HostingEnvironment.ContentRootPath;
    }
}

IHostingEnvironment服務還可以直接註入到Configure方法以設置處理管道:

//示例3:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        // In Development, use the Developer Exception Page
        app.UseDeveloperExceptionPage();
    }
    else
    {
        // In Staging/Production, route exceptions to /error
        app.UseExceptionHandler("/error");
    }
    var contentRootPath = env.ContentRootPath;
}

創建自定義中間件(要瞭解中間件的同學們,可以移步到第四章節學習)時可以將IHostingEnvironment 註入Invoke方法:

public async Task Invoke(HttpContext context, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        // Configure middleware for Development
    }
    else
    {
        // Configure middleware for Staging/Production
    }
    var contentRootPath = env.ContentRootPath;
}

7.IApplicationLifetime介面

IApplicationLifetime允許後啟動和關閉活動。介面上的三個屬性是用於註冊Action方法(用於定義啟動和關閉事件)的取消標記。

取消標記

觸發條件

ApplicationStarted

主機已完全啟動。

ApplicationStopped

主機正在完成正常關閉。應處理所有請求。 關閉受到阻止,直到完成此事件。

ApplicationStopping

主機正在執行正常關閉。仍在處理請求。關閉受到阻止,直到完成此事件。

public class Startup
{
    public void Configure(IApplicationBuilder app, IApplicationLifetime appLifetime)
    {
        appLifetime.ApplicationStarted.Register(OnStarted);
        appLifetime.ApplicationStopping.Register(OnStopping);
        appLifetime.ApplicationStopped.Register(OnStopped);
        Console.CancelKeyPress += (sender, eventArgs) =>
        {
            appLifetime.StopApplication();
            // Don't terminate the process immediately, wait for the Main thread to exit gracefully.
            eventArgs.Cancel = true;
        };
    }
    private void OnStarted()
    {
        // Perform post-startup activities here
    }
    private void OnStopping()
    {
        // Perform on-stopping activities here
    }
    private void OnStopped()
    {
        // Perform post-stopped activities here
    }
}

StopApplication是請求應用終止的意思。以下類在調用類的Shutdown方法時使用StopApplication正常關閉應用:

public class MyClass
{
    private readonly IApplicationLifetime _appLifetime;
    public MyClass(IApplicationLifetime appLifetime)
    {
        _appLifetime = appLifetime;
    }
    public void Shutdown()
    {
        _appLifetime.StopApplication();
    }
}

8.作用域驗證

如果應用環境為“開發(Development)”,則CreateDefaultBuilder將ServiceProviderOptions.ValidateScopes設為true。若將ValidateScopes設為true,預設服務提供應用程式會執行檢查來驗證以下內容:
●作用域服務不能直接或間接地從根服務提供者解析。
●作用域服務不會直接或間接地註入到單例中(服務的生命周期)。
若要始終驗證作用域(包括在生命周期環境中驗證),請使用主機生成器上的 UseDefaultServiceProvider配置ServiceProviderOptions:

WebHost.CreateDefaultBuilder(args)
    .UseDefaultServiceProvider((context, options) => {
        options.ValidateScopes = true;
})


參考文獻:
ASP.NET Core Web主機


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

-Advertisement-
Play Games
更多相關文章
  • .lib .dll文件都是程式可直接引用的文件,前者就是所謂的庫文件,後者是動態鏈接庫(Dynamic Link Library)也是一個庫文件。而.pdb則可以理解為符號表文件。動態庫在沒有lib文件時,也可以通過顯示鏈接進行引用。 ...
  • 請求庫: 1. requests 這個庫是爬蟲最常用的一個庫 2. Selenium Selenium 是一個自動化測試工具,利用它我們可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作 對於一些用JS做誼染的頁面來說,這種抓取方式是非常有效的。 3.ChomeDrive 安裝了這個庫,才能驅動Chr ...
  • ![](https://img2018.cnblogs.com/blog/1752914/201908/1752914-20190809210316241-1751719075.png) ...
  • Python3 匿名函數 定義一個函數與變數的定義非常相似,對於有名函數,必須通過變數名訪問 匿名函數定義:使用 lambda 來創建匿名函數 匿名函數1. 沒有名字 2:函數體自帶return 匿名函數 匿名函數的應用場景:應用於一次性的場景,臨時使用 2、匿名函數結合使用內置函數的用法 max, ...
  • 下麵這樣的一串代碼相信很多人都寫過,但可能除了你自己沒有人看得懂: for range in range(n): for j in range(m): for k in range(l): temp_value = X [i] [j] [k] * 12.5 new_array [i] [j] [k] ...
  • 資料庫 一. 資料庫基本概念 1、資料庫DataBase,簡稱DB 2、概念:什麼是資料庫?存儲數據的倉庫 3、資料庫的特點: 持久化的存儲數據,資料庫本質上是一個文件系統 方便對數據進行存儲和管理 使用了統一的資料庫操作語言 SQL語言 4、常見的資料庫管理系統(DataBase Manageme ...
  • 一. 複雜標簽 1.1 下拉列表 select、option 必須將select和option結合在一起使用,才能形成完整的下拉列表結構,缺一不可。 格式: 註:在選中某一選項提交時,會將name值與選中選項的value形成鍵值對一併提交到伺服器。 selected屬性可以表示預設選中項,寫法與ch ...
  • 選擇圖像根據坐標得到圖像。 環境 Visual Studio 2019,dotNet Framework 4.0 SDK 支持Windows XP,Windows Win7、8、10 項目地址 效果 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...