ASP.NET Core提供 WebHostBuilder建立Host(IWebHost
)來負責管理網站應用程式的請求管線(pipeline)、生命週期以及與Server間等各種設定。
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值對的載入,來源依序包含:
- appsettings.json檔案
- appsettings.{Environment}.json檔案(Environment來源自設定環境變數
ASPNETCORE_ENVIRONMENT
- 如果是開發環境(Environment="Development"),則加入User Secrets的設定
- 環境變數
- 使用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 = Development時啟用,否則只會回應500
- 設定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")
- 預設是