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