asp.net core 系列 16 Web主機 IWebHostBuilder

来源:https://www.cnblogs.com/MrHSR/archive/2019/01/25/10314107.html
-Advertisement-
Play Games

一.概述 在asp.net core中,Host主機負責應用程式啟動和生存期管理。host主機包括Web 主機(IWebHostBuilder)和通用主機(IHostBuilder)。Web 主機是適用於托管 Web 應用;通用主機(ASP.NET Core 2.1 或更高版本)是適用於托管非 We ...


一.概述

         在asp.net core中,Host主機負責應用程式啟動和生存期管理。host主機包括Web 主機(IWebHostBuilder)和通用主機(IHostBuilder)。Web 主機是適用於托管 Web 應用;通用主機(ASP.NET Core 2.1 或更高版本)是適用於托管非 Web 應用;在未來的版本中,通用主機將適用於托管任何類型的應用,包括 Web 應用。 通用主機最終將取代 Web 主機。本篇先來瞭解ASP.NET Core Web主機。

  

  1.1 設置Web主機以及執行的任務

    創建使用 IWebHostBuilder 實例的主機。 通常在應用的入口點 Main 方法中執行。 在項目模板中,Main 位於 Program.cs。

         public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();

    下麵詳細說下CreateDefaultBuilder 執行的下列任務:

    (1) 將內置的 Kestrel 伺服器配置為 Web 伺服器。

    (2) 設置content root 內容根路徑,並由 Directory.GetCurrentDirectory 返回的路徑。

    (3) 通過以下載入主機配置:

      首碼為 ASPNETCORE_ 的環境變數(例如,ASPNETCORE_ENVIRONMENT)。

      命令行參數。

    (4) 按以下順序載入應用配置

      appsettings.json。

                     appsettings.{Environment}.json。

                     應用在使用入口程式集的 Development 環境中運行時的機密管理器。

                     環境變數。

                     命令行參數。

    (5) 設置console and debug 輸出的日誌記錄。在 appsettings.json 或 appsettings.{Environment}.json 文件的日誌記錄配置部分(Logging)中指定的日誌篩選規則。

    (6)  ASP.NET Core 模塊使用IIS托管運行時,CreateDefaultBuilder 會啟用 IIS 集成,這會配置應用的基址和埠。 IIS 集成還配置應用以捕獲啟動錯誤。

    (7) 如果應用環境為“開發”,請將 ServiceProviderOptions.ValidateScopes 設為 true。

 

  1.2 Web主機的擴展配置

     IWebHostBuilder下的ConfigureAppConfiguration、ConfigureLogging 以及其他方法可重寫(第三大點講)和增強 CreateDefaultBuilder 定義的配置。 下麵是一些示例:

    (1) ConfigureAppConfiguration 

      ConfigureAppConfiguratio用於指定應用的 IConfiguration。下麵的 ConfigureAppConfiguration 調用添加委托,以在 appsettings.xml 文件中添加應用配置。 可多次調用 ConfigureAppConfiguration。具體參照 ”asp.net core 系列 10 配置configuration“ 。

      WebHost.CreateDefaultBuilder(args)
      .ConfigureAppConfiguration((hostingContext, config) =>
      {
          config.AddXmlFile("appsettings.xml", optional: true, reloadOnChange: true);
      })

    (2) ConfigureLogging

      ConfigureLogging調用添加委托,以將最小日誌記錄級別 (SetMinimumLevel) 配置為 LogLevel.Warning。 此設置重寫 CreateDefaultBuilder 在 appsettings.Development.json 和 appsettings.Production.json 中配置的設置,分別為 LogLevel.Debug 和 LogLevel.Error。 可多次調用 ConfigureLogging。具體參照 “asp.net core 系列 13 日誌”。

      WebHost.CreateDefaultBuilder(args)
      .ConfigureLogging(logging => 
      {
          logging.SetMinimumLevel(LogLevel.Warning);
      })

    (3) ConfigureKestrel

      下麵調用 ConfigureKestrel 來重寫 CreateDefaultBuilder 在配置 Kestrel 時預設的 30,000,000 位元組,大約為28.6MB。MaxRequestBodySize是獲取或設置任何請求主體的最大允許大小(以位元組為單位)。設置為null時,最大請求正文大小不受限制。

      WebHost.CreateDefaultBuilder(args)
      .ConfigureKestrel((context, options) =>
      {
          options.Limits.MaxRequestBodySize = 20000000;
      });

 

二.主機配置值

  WebHostBuilder 依賴於以下的方法設置主機配置值:

     (1)主機生成器配置,其中包括格式 ASPNETCORE_{configurationKey} 的環境變數。 例如 ASPNETCORE_ENVIRONMENT。

    (2)UseContentRoot 和 UseConfiguration 等擴展。

    (3)UseSetting 和關聯鍵。 使用 UseSetting 設置值時,該值設置為無論何種類型的字元串。

  2.1  Application Key (Name)

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

      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            //應用程式預設名稱為:MyNetCoreStudy (也就是項目名稱)
            string s = env.ApplicationName;
            //..
     //顯示設置
     WebHost.CreateDefaultBuilder(args)   .UseSetting(WebHostDefaults.ApplicationKey,
"CustomApplicationName")

  2.2捕獲啟動錯誤

    啟動錯誤的捕獲。 預設為 false, 啟動期間出錯,主機退出。當 true 時,主機在啟動期間捕獲異常並嘗試啟動伺服器。當程式使用 Kestrel 在 IIS 後方運行,預設值是 true。環境變數:ASPNETCORE_CAPTURESTARTUPERRORS

      WebHost.CreateDefaultBuilder(args)
      .CaptureStartupErrors(true)

  2.3 內容根

    設置確定web根目錄的基路徑。用於搜索的內容文件,比如mvc的視圖。預設為應用程式集所在的文件夾。環境變數:ASPNETCORE_CONTENTROOT。

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

  2.4 詳細錯誤  

    確定是否應捕獲詳細錯誤。預設值:false。啟用為true時,會捕獲詳細的異常。或當環境設置為 Development時也會捕獲詳細的異常。 環境變數 ASPNETCORE_DETAILEDERRORS

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

  2.5 環境  

    設置應用的環境。預設值:Production。 使用 Visual Studio 時,可能會在 launchSettings.json 文件中設置環境變數。環境變數:ASPNETCORE_ENVIRONMENT

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

  2.6 HTTPS 埠

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

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

  2.7 伺服器 (Kestrel) URL

    指示 IP 地址或主機地址,host啟動時偵聽。預設: http://localhost:5000。設置為伺服器響應的以分號分隔 (;) 的 URL 首碼列表。環境變數:ASPNETCORE_URLS

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

 

三.重寫(覆蓋)配置

         配置可用於配置 Web 主機。 在下麵的示例中,主機配置是根據需要在 hostsettings.json 文件中指定。 命令行參數可能會重寫從 hostsettings.json 文件載入的任何配置。 生成的配置(在 config 中)用於通過 UseConfiguration 配置主機。 IWebHostBuilder 配置會添加到應用配置中。

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

            return WebHost.CreateDefaultBuilder(args)
                .UseUrls("http://*:5000")
                //config重寫UseUrls
                .UseConfiguration(config)
                .Configure(Handle1);
        }

        private static void Handle1(IApplicationBuilder app)
        {
            app.Run(async context =>
           {
               await context.Response.WriteAsync("Handle1 Test 1");
           });
        }

  如果在執行 dotnet 運行時從命令提示符傳入。 命令行參數,重寫 hostsettings.json 文件中的 urls 值,且伺服器偵聽埠 8080。

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

    啟動時,url參數重寫的的關係是:UseUrls被hostsettings.json重寫, hostsettings.json又被命令行參數重寫。

 

四 .管理主機

         對於啟動主機有二種方式:run和start。使用Run 方法啟動 Web 應用是阻止調用線程,直到顯示關閉主機。使用start方法是非阻止方式運行主機。具體用法請查看官網。

    // Runs a web application and block the calling thread until host shutdown.
    CreateWebHostBuilder(args).Build().Run();
     CreateWebHostBuilder(args).Build().Start();
     //非阻止方式,所有必須加上ReadLine,
     Console.ReadLine();

 

五. IHostingEnvironment 介面

  IHostingEnvironment 介面提供有關應用的 Web 承載環境的信息,預設是將 IHostingEnvironment 註入到 Startup構造函數,在Configure方法中引用。下麵使用構造函數註入獲取 IHostingEnvironment 以使用其屬性和擴展方法:

public class CustomFileReader
{
    private readonly IHostingEnvironment _env;

    public CustomFileReader(IHostingEnvironment env)
    {
        _env = env;
    }

    public string ReadFile(string filePath)
    {
        //返回IFileProvider,指向 WebRootPath
        var fileProvider = _env.WebRootFileProvider;
        // Process the file here
    }
}

   創建自定義中間件時可以將 IHostingEnvironment 註入 Invoke 方法(參考asp.net core 系列 15 中間件):

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

 

六.IApplicationLifetime 介面

         IApplicationLifetime 用於應用程式在啟動和關閉時的活動。 介面上的三個屬性是用於註冊 Action 方法。用於定義啟動和關閉事件標記。

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

 

七. 作用域驗證

  如果應用環境為“開發”,則 CreateDefaultBuilder 將 ServiceProviderOptions.ValidateScopes 設為 true。若將 ValidateScopes 設為 true,預設服務提供程式會執行檢查來驗證以下內容:

         作用域服務不能直接或間接地從根服務提供者解析。

         作用域服務不會直接或間接地註入到單例中(服務的生存期)。

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

  當true將執行檢查,驗證作用域服務,永遠不會從根提供程式解析(不從頂級容器中獲取scoped生命周期服務,所有服務都是註入到容器中IServiceCollection)。 mark:沒有完全理解,以後再說。

 

 參考文獻:

    官方文檔:ASP.NET Core Web主機

   


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

-Advertisement-
Play Games
更多相關文章
  • ASP.NET Boilerplate入門踩坑/ABP Module Zero/.NET Core 2.2 + Vue.js ...
  • 上面的例中,當打斷點調試時,斷點斷住時, Attr1屬性的get塊就會執行一次。 兩個斷點加在邏輯中對Attr1的訪問,最後發現CTest get Attr1.列印了3次。 得到的結論是:多餘的2次列印是由於斷點使得程式中斷引發的,中斷後調試器需要獲取Attr1的數值,對get塊進行調用。 不調試直 ...
  • Windows Service這一塊並不複雜,但是註意事項太多了,網上資料也很凌亂,偶爾自己寫也會丟三落四的。所以本文也就產生了,本文不會寫複雜的東西,完全以基礎應用的需求來寫,所以不會對Windows Service寫很深入。 本文介紹瞭如何用C#創建、安裝、啟動、監控、卸載簡單的Windows ...
  • 在這篇《MVC 5使用TempData Object跨視圖傳遞數據》https://www.cnblogs.com/insus/p/3378016.html中,已經在評論回覆網友:網上查找到的資料: ...
  • 在本節中,您將看到ASP.NET Core應用程式如何運行的,從請求URL開始到頁面呈現在瀏覽器中。 為此,您將看到 一個HTTP請求在Web伺服器中是如何被處理的、ASP.NET Core如何擴展該過程以創建動態頁面。 ...
  • 前言: 對於一個簡單的資料庫應用,由於對於資料庫的訪問不是很頻繁。這時可以簡單地在需要訪問資料庫時,就新創建一個連接,用完後就關閉它,這樣做也不會帶來什麼明顯的性能上的開銷。但是對於一個複雜的資料庫應用,情況就完全不同了。頻繁的建立、關閉連接,會極大的減低系統的性能,因為對於連接的使用成了系統性能的 ...
  • 上一章介紹了經過路由的處理,一個請求找到了具體處理這個請求的EndPoint,並最終執行它的RequestDelegate方法來處理這個Httpcontext。本章繼續這個處理進程,按照慣例,依然通過幾幅圖來聊一聊這個RequestDelegate之後的故事。在此就避免不了的聊到各種Filter,它 ...
  • 最近接到一個任務,加密DotNet項目的配置文件。配置文件里需要加密的地方一共有兩塊,一個是資料庫連接字元串,一個是自定義的所有AppSettings。 一開始接到這個任務我是拒絕的,因為壓根不知道怎麼加密,印象中的加密方式還停留在MD5。對於啥是對稱加密,啥是非對稱加密完全不認識。 加密方式 因為 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...