.NET Core 的專案的底層,都是從 Console Program 開始的。就稍微比較一下透過 dotnet cli 所產生的 console program 和 empty web program 的檔案差異。
檔案差異
Program.cs
Console
1 | using System; |
Web
1 | using System; |
差異
Console
與 Web
專案架構基本上是一樣的,唯一有差異的是,Web 專案需要跑 WebHost Builder 來建立網站。
.csproj
Console
1 | <Project Sdk="Microsoft.NET.Sdk"> |
Web
1 | <Project Sdk="Microsoft.NET.Sdk.Web"> |
差異
web
專案多包含了一個 wwwroot
資料夾,及 Microsoft.AspNetCore.All
的 package。
建立WebHost
WebHost
透過 WebHost.CreateDefaultBuilder
建立一個 Microsoft.AspNetCore.Hosting.IWebHost
並在 Main
下執行
CreateDefaultBuilder
執行CreateDefaultBuilder(args)
時, WebHostBuilder
會有以下的預設值
- 使用 Kestrel 為網站伺服器
- 跟目錄為目前所在的資料夾位置
- 預設載入
appsetting.json
及appsettings.[environment].json
設定檔 - 如果是開發模式時,會載入 User Secrets
- 使用環境變數 (environment variables)
- 接受從命令列傳入的參數
- 當做 logging 時,會輸出到
console
跟debug output
- 開啟
IISIntegration
- 如果是開發模式,新增例外狀況頁面
UseStartup
UseStartUp
是 IWebHostBuilder
的擴充功能,接受一個 AssemblyName 並使用 IWebHostBuilder
內部的 UseSetting
的方法新增或更新 _config
裡鍵值為WebHostDefaults.ApplicationKey
與 WebHostDefaults.StartupAssemblyKey
下,_config
為一個 IConfiguration
物件。建立程式碼如下,僅供參考使用
1 | private IConfiguration _config; |
build
建立 WebHost
物件
Startup
Startup
用來設定網站會使用到的 service
,參數
、middleware
等。基本上都在這支程式內搞定
ConfigureServices
設定有哪些服務可以使用
1 | public void ConfigureServices(IServiceCollection services) |
ConfigureServices
不一定要存在,如果有,他會在Configure
前被執行- 如果要設定 Configuration options,需要在此設定
- 使用的服務需要設定時,可透過
IServiceCollection
的Add[Service]
的方式註冊- 如上述範例為註冊 Entity Framework、Identity、MVC
- DI 也會在
ConfigureServices
裡設定
Configure
設定使用哪些服務
1 | public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) |
Congiure
是用來設定 ASP.NET 應用程式會對請求,透過 middleware 組合的方式,做出一系列的動作與回應。middleware
物件使用Use
的方法,將物件家到在IApplicationBuilder
上
初始服務
在一開始就有一些初始服務的存在,分別為
- constructor:
IHostingEnvironment
,ILoggerFactory
- ConfigureServices:
IServiceCollecton
Configure
:IApplicationBuilder
、IHostingEnvironment
、ILoggerFactory
、IApplicationLifetime
Empty Web Template 的 startup.cs
1 | public class Startup |
在初始的專案範本裡,只有在 Configure
的地方寫了兩個功能
- 注入
IApplicationHilder
與IHostingEnvironment
兩個服務 - 判斷如在開發模式下,新增顯示開發者例外狀況頁面功能
- 回傳 「Hello World!」 的文字給畫面顯示
回顧
- Web 應用程式也是 Console 程式
- 使用
IWebHostBuilder
的方式建立一個WebHost
並將其執行起來,就可將 Console 程式變成一個網頁伺服器 - 可透過
Startup.cs
的方式設定 WebHost - 所有的
Dependency Injection
需要在 Startup.cs 檔案內的ConfigureServices
方法做註冊動作 - .NET Core Web 是使用 middleware 的方式來設定網站會如何對連線請求做回應
- 在
Configure
方法內做middleware
的順序及相關功能設定