我心中的ASP.NET Core 新核心对象WebHost(二)
這是ASP.NET Core新核心對象系列的第二篇,上一篇?WebHost準(zhǔn)備階段?我們講到了WebHostBuilder的初始化及配置。我們給WebHostBuilder進(jìn)行以下配置
UseKestrel?設(shè)置Kestrel為HttpServer
ConfigureAppConfiguration?設(shè)置了配置文件
ConfigureLogging?配置了日志處理器,添加了 Debug和控制臺兩種方式
UseStartup?指定了Startup類
有了一個(gè)WebHostBuilder之后,我們就可以調(diào)用它的Build方法來構(gòu)建一個(gè)WebHost。
我們可以先來看一下Build方法的代碼
BuildCommonServices
這是 WebHostBuild方法執(zhí)行的第一個(gè)方法,主要是new ServiceCollection 以及完成了以下幾個(gè)基礎(chǔ)實(shí)例的注冊:
-
IApplicationBuilderFactory
-
IHttpContextFactory
-
IMiddlewareFactory
-
IStartupFilter
-
IServiceProviderFactory<IServiceCollection>
-
IStartup
其實(shí)將IStartup注冊到 DI,利用了兩種方式 。如果我們在WebHostBuilder中指定的 Startup.cs繼承自 IStartup接口,則直接綁定到IStartup。
if (typeof(IStartup).GetTypeInfo().IsAssignableFrom(startupType.GetTypeInfo())) {services.AddSingleton(typeof(IStartup), startupType); }否則,需要?按照命名規(guī)則來構(gòu)造一個(gè)Startup。
services.AddSingleton(typeof(IStartup), sp => {var hostingEnvironment = sp.GetRequiredService<IHostingEnvironment>();var methods = StartupLoader.LoadMethods(sp, startupType, hostingEnvironment.EnvironmentName);return new ConventionBasedStartup(methods); });Host的初始化
Host的初始化是我們這次要講的重點(diǎn),因?yàn)樗瓿闪苏麄€(gè)Http管道的構(gòu)建。
if (_application == null){_application = BuildApplication();}這個(gè)_application即是一個(gè)RequestDelegate。參數(shù)為一個(gè)HttpContext。
public?delegate?Task?RequestDelegate(HttpContext context);我們來看一下BuildApplication方法有7步,后面的五步總結(jié)起來是構(gòu)造IAapplicationBuilder并用Startup.cs的Configure方法構(gòu)造一個(gè)我們上面講的這個(gè)RequestDeleaget。
IApplicationBuilder?
IApplicationBuilder定義在HttpAbstractions這個(gè)項(xiàng)目里面,HttpAbstractions是ASP.NET Core在 Githab上的一個(gè)子項(xiàng)目,也是ASP.NET Core的重要組成部分,它定義了很多ASP.NET Core中關(guān)于HTTP處理整個(gè)過程中的行為。 IApplicationBuilder就算一個(gè)。
它主要包括以幾個(gè)重要的屬性:
我們在Startup.cs中看到的Configure方法給的參數(shù)就是這個(gè)IApplicationBuilder,而這個(gè)方法是用來添加Middleware的。
public?void?Configure(IApplicationBuilder app)?{ // 相當(dāng)于 List<Middleware>().add(某個(gè)middleware)app.Use(某個(gè)Middleware) }它決定了我們的一個(gè)請求會經(jīng)歷哪些步驟最終返回給客戶端。但是它的生命很短暫,畢竟它只是個(gè)Builder,在它完成管道的構(gòu)建之后,它就生命就結(jié)束了。構(gòu)建管理的過程很簡單:
-
從DI中獲取IApplicationBuilderFactory 實(shí)例 builderFactory
-
builderFactory.CreateBuilder() 得到 ApplicationBuilder
-
獲取IStartupFilter實(shí)例
-
調(diào)用IStartupFilter實(shí)例的Configure方法,傳處第二步得到的ApplicationBuilder
-
調(diào)用 ApplicationBuilder的Builder方法,也就是我們上面講的,把所有注冊的Middleware串起來最后返回一個(gè)RequestDelegate
WebHost.Start
在我們的WebHost初始化完成之后,它的Start方法會被調(diào)用來啟動IServer的端口監(jiān)聽,并開始處理Http請求。這是WebHost的第三階段:啟動過程?
原文:http://www.jessetalk.cn/2017/11/14/aspnet-core-object-webhost-build/?
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的我心中的ASP.NET Core 新核心对象WebHost(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio交叉编译器提供
- 下一篇: ASP.NET Core 认证与授权[5