program.cs
ASP.NET Core 程序基於一個命令行的程序運行,程序的入口在program.cs的main方法。
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, 並且調用了以下擴展方法:
- UseKestrel 使用kestrel server來處理請求
- UseContentRoot 設置站點目錄
- ConfigureAppConfiguration
- ConfigureLogging
UseKestrel
WebHost負責托管ASP.NET Core,但是它並不真正從服務器網卡上監聽端口以及將網絡字節轉換到.net core的管道。這些由IServer來處理。
這里先簡單了解一下這個過程,我們后面會在IServer的環節再詳述。我們這里使用的UseKestrel 來自於github上的項目 KestrelHttpServer。
里面的Kestrel項目下有一個WebHostBuilderKestrelExtensions類。里面就是這個 UseKestrel擴展方法的定義:
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開頭,進行配置)
ASP.NET Core源碼里面大量使用擴展方法進行Servier DI的配置,擴展方法定義在各種不同的命名空間以及項目下。如果不習慣或者不了解相關的部分會覺得有些痛苦。
ConfigureAppConfiguration
這個方法專門用來為 WebHostBuilder添加配置,包括appsettings.json的、命令行參數以及環境變量。關於配置這一節我們留在后面具體來講。
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。關於日志這一節我們留在后面具體來講。
logging.AddConfiguration(
hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
UseStartup<>
Startup.cs這個類主要做兩件事情的配置Service DI和http管道,這些都是在WebHost啟動之前就需要確定下來的。而UseStartup就是將我們定義的Startup.cs和 IStartup綁定起來,讓WebHost可以找得到。 怎么綁定呢? 當然還是依賴注入:
if (typeof(IStartup)
.GetTypeInfo()
.IsAssignableFrom(startupType.GetTypeInfo()))
{
services.AddSingleton(typeof(IStartup), startupType);
}
else
{
services.AddSingleton(typeof(IStartup), sp =>
{
var hostingEnvironment =
sp.GetRequiredService<IHostingEnvironment>();
<span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> ConventionBasedStartup(
StartupLoader.LoadMethods(
sp,
startupType,
hostingEnvironment.EnvironmentName));
});
}
VS為我們添加的Startup.cs默認不繼續IStartup接口,所以是采用Convention的這種方式,當然我們也可以繼承IStartup則直接注冊成單例到應用程序。
以上是整個 WebHostBuilder的准備階段,即往里面放了很多的參數。下一篇我們將接着講Builder階段,給了你那么多,你要開始制造點什么東西給我了。
本文首發於公眾號jessetalk,轉載請保留公眾號二維碼。
<div class="section section-blog-info">
<div class="row">
<div class="col-md-6">
<div class="entry-categories">分類: <span class="label label-primary"><a href="http://www.jessetalk.cn/category/tech/">技術隨筆</a></span> </div>
<div class="entry-tags">標簽:<span class="entry-tag"><a href="http://www.jessetalk.cn/tag/asp-net-core/" rel="tag">asp.net core</a></span></div> </div>
<div class="col-md-6">
<div class="entry-social">
<a target="_blank" rel="tooltip" data-original-title="分享到 Facebook" class="btn btn-just-icon btn-round btn-facebook" href="https://www.facebook.com/sharer.php?u=http://www.jessetalk.cn/2017/11/11/aspnet-core-object-webhost/">
<i class="fa fa-facebook"></i>
</a>
<a target="_blank" rel="tooltip" data-original-title="分享至微博" class="btn btn-just-icon btn-round btn-twitter" href="http://twitter.com/share?url=http://www.jessetalk.cn/2017/11/11/aspnet-core-object-webhost/&text=%E6%88%91%E5%BF%83%E4%B8%AD%E7%9A%84ASP.NET%20Core%20%E6%96%B0%E6%A0%B8%E5%BF%83%E5%AF%B9%E8%B1%A1WebHost%EF%BC%88%E4%B8%80%EF%BC%89">
<i class="fa fa-twitter"></i>
</a>
<a rel="tooltip" data-original-title=" Share on Email" class="btn btn-just-icon btn-round" href="mailto:?subject=我心中的ASP.NET%20Core%20新核心對象WebHost(一)&body=http://www.jessetalk.cn/2017/11/11/aspnet-core-object-webhost/">
<i class="fa fa-envelope"></i>
</a>
</div>
</div> </div>
<hr>
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
支持,感謝