[ASP.NET Core]WebHost-源起

  • 976
  • 0
  • 2017-10-24

ASP.NET Core提供 WebHostBuilder建立Host(IWebHost)來負責管理網站應用程式的請求管線(pipeline)、生命週期以及與Server間等各種設定。 

Hosting ASP.NET Core in a process

WebHost就像是網頁中javascript的windows物件一樣,是負責裝載&運行ASP.NET Core的源頭,WebHost中註冊各種Services(如使用的Server、Configuration、Logger等)如同window.Array、window.Object、window.concole()瀏覽器提供實作。

Program Main()創建WebHost

ASP.NET Core其實是個主控台應用程式,因此如同一般程式一樣透過static Main函式建構並啟動WebHost。

public static void Main(string[] args) {
    BuildWebHost(args).Run();
}

public static IWebHost BuildWebHost(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .UseLibuv()
    .UseStartup < Startup > ()
    .Build();

預設使用WebHost.CreateDefaultBuilder()-具備Call once set ready work

封裝在ASP.NET Core MetaPackages,執行下列幾個主要任務:(github source code)

  • 設定使用Kestrel HTTP Server
  • 設定網站根目錄為當前程序的工作目錄
  • 網站組態設定Key/Value值對的載入,來源依序包含:
    1. appsettings.json檔案
    2. appsettings.{Environment}.json檔案(Environment來源自設定環境變數ASPNETCORE_ENVIRONMENT
    3. 如果是開發環境(Environment="Development"),則加入User Secrets的設定
    4. 環境變數
    5. 使用CLI(Command-Line Interface)執行時帶入的參數
  • 設定.NET提供的Logger記錄
  • 設定ANCM(ASP.NET Core Module),並嘗試啟用(IIS only)

 通過CreateDefaultBuilder配置預設且完整WebHost功能,可再依需求呼叫任何方法改變預設設定,例如重設根目錄

自訂WebHost - WebHostBuilder建構 

透過WebHostBuilder提供完全自訂WebHost的能力

public static void Main(string[] args)
{
    var host = new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .Configure(app =>
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        })
  
     
        .Build();

    host.Run();
}

WebHostBuiler API都有說明文件與範例

以下稍微列舉幾種常用或特別的API:

  • 捕捉詳細錯誤資訊:
    • 預設只有在Environment = Development時啟用,否則只會回應500
      .UseSetting(WebHostDefaults.DetailedErrorsKey, "true")
  • 設定Environment(不分大小寫):
    • 預設讀取環境變數ASPNETCORE_ENVIRONMENT,專案->屬性->偵錯->環境變數已設定成Development
      .UseEnvironment("Development")//Development, Staging,Production
  • 設定網站根目錄(=IHostingEnvironment.WebRootPath):
    • 預設是內容根目錄/wwwroot
      .UseWebRoot("pageroot")//default "wwwroot"
      .UseWebRoot(@"C:\pageroot")

       

  • 設定內容根目錄(=IHostingEnvironment.ContentRootPath):
    • 預設是Directory.GetCurrentDirectory()
      .UseContentRoot(@"C:\Web")