program.cs
ASP.NET Core 程序基於一個命令行的程序運行,程序的入口在program.cs的main方法。javascript
public static void Main(string[] args) {
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build()
.Run();
}
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
CreateDefaultBuilder方法
這個方法負責返回給咱們一個WebHostBuilder, 而且調用瞭如下擴展方法:php
- UseKestrel 使用kestrel server來處理請求
- UseContentRoot 設置站點目錄
- ConfigureAppConfiguration
- ConfigureLogging
UseKestrel
WebHost負責託管ASP.NET Core,可是它並不真正從服務器網卡上監聽端口以及將網絡字節轉換到.net core的管道。這些由IServer來處理。css
這裏先簡單瞭解一下這個過程,咱們後面會在IServer的環節再詳述。咱們這裏使用的UseKestrel 來自於github上的項目 KestrelHttpServer。html
裏面的Kestrel項目下有一個WebHostBuilderKestrelExtensions類。裏面就是這個 UseKestrel擴展方法的定義:java
public static IWebHostBuilder UseKestrel( this IWebHostBuilder hostBuilder) {
return hostBuilder.ConfigureServices(services =>
{
// Don't override an already-configured transport
services.TryAddSingleton<
ITransportFactory,
SocketTransportFactory>();
services.AddTransient<
IConfigureOptions<KestrelServerOptions>,
KestrelServerOptionsSetup>();
services.AddSingleton<
IServer,
KestrelServer>();
});
}
其實也很簡單,都是在進行Server依賴的配置,由於最終的執行都由WebHost來展控。因此WebHost大量依賴的其它外部組件都被定義成接口放到了HttpAbstractions裏面,而後由外部擴展方法(多以Use開頭,進行配置)git
ASP.NET Core源碼裏面大量使用擴展方法進行Servier DI的配置,擴展方法定義在各類不一樣的命名空間以及項目下。若是不習慣或者不瞭解相關的部分會以爲有些痛苦。程序員
ConfigureAppConfiguration
這個方法專門用來爲 WebHostBuilder添加配置,包括appsettings.json的、命令行參數以及環境變量。關於配置這一節咱們留在後面具體來說。github
config.AddJsonFile(
"appsettings.json",
optional: true,
reloadOnChange: true)
.AddJsonFile(
$"appsettings.{env.EnvironmentName}.json",
optional: true,
reloadOnChange: true);
config.AddEnvironmentVariables();
config.AddCommandLine(args);
ConfigureLogging
logging也是 ASP.NET Core內置組件中的很重要一個,這個方法在默認已經爲咱們添加了appsettings中的logging配置以及控制檯log。關於日誌這一節咱們留在後面具體來說。web
logging.AddConfiguration(
hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
UseStartup<>
Startup.cs這個類主要作兩件事情的配置Service DI和http管道,這些都是在WebHost啓動以前就須要肯定下來的。而UseStartup就是將咱們定義的Startup.cs和 IStartup綁定起來,讓WebHost能夠找獲得。 怎麼綁定呢? 固然仍是依賴注入:json
if (typeof(IStartup)
.GetTypeInfo()
.IsAssignableFrom(startupType.GetTypeInfo()))
{
services.AddSingleton(typeof(IStartup), startupType);
}
else
{
services.AddSingleton(typeof(IStartup), sp =>
{
var hostingEnvironment =
sp.GetRequiredService<IHostingEnvironment>();
return new ConventionBasedStartup(
StartupLoader.LoadMethods(
sp,
startupType,
hostingEnvironment.EnvironmentName));
});
}
VS爲咱們添加的Startup.cs默認不繼續IStartup接口,因此是採用Convention的這種方式,固然咱們也能夠繼承IStartup則直接註冊成單例到應用程序。
以上是整個 WebHostBuilder的準備階段,即往裏面放了不少的參數。下一篇咱們將接着講Builder階段,給了你那麼多,你要開始製造點什麼東西給我了。
本文首發於公衆號jessetalk,轉載請保留公衆號二維碼。
6 條評論
zhang · 2017年11月25日 下午1:06
支持
fei · 2017年11月25日 下午1:07
評論加郵箱是否有些多餘
碼農阿宇 · 2017年12月14日 下午10:06
感謝騰飛寫了這麼好的文章,已經轉發並註明了來源而且保留了公衆號二維碼 謝謝
Chain · 2017年12月29日 上午9:19
已學習。
Allen · 2018年2月27日 下午2:37
感謝
Jay · 2018年7月16日 下午6:13
支持,感謝