日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

我心中的ASP.NET Core 新核心对象WebHost(一)

發(fā)布時間:2023/12/4 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我心中的ASP.NET Core 新核心对象WebHost(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

以本系列文章向Fish 前輩的那篇我心中的ASP.NET 核心對象致敬。(雖然不知道前輩現(xiàn)在在干什么)。一晃就6年過去了,那首?郝云 的《回到那一天》怎么唱來著? 時光一晃,你就三十了。

而我們都變成了老了的程序員?

?

ASP.NET Core在解開了對windows的依懶之后,整個管線都發(fā)生了變化 。這個變化是徹底的,原來ASP.NET 中的有些對象直接沒有了。被保留下來的,也只是你看起來還差不多,但實現(xiàn)已經(jīng)完全不一樣了。

?

我們就來說說我認(rèn)為的這些ASP.NET Core的這些新的核心對象。

WebHost,?IServiceCollection,IServiceProvider,IApplicationBuilder,IMiddleware 和 RequestDelegate, IServer和IHttpApplication

還有一些同樣很重要的對象: ILogger, IConfiguration?

始于WebHost

WebHost像母親,它承載和孕育了ASP.NET Core下幾乎所有的對象,從代碼層面入手來看的話可以說是ASP.NET Core的入口,沒有它,后面的一切都沒有辦法開始。當(dāng)然如何復(fù)雜的一項業(yè)務(wù),要做好也不容易,WebHost的啟動一共分為四階段。

  • 準(zhǔn)備階段: var builder = new WebHostBuilder(),然后給WebHostBuilder各種填參數(shù)

  • 構(gòu)建階段: var host = builder.Builder() , 主要負(fù)責(zé)依懶注入的初始化,以及host的初始化

  • 啟動階段: host.start();?

  • 運行階段

program.cs

ASP.NET Core?程序基于一個命令行的程序運行,程序的入口在program.cs的main方法。

public static void Main(string[] args){WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().Build().Run(); }

WebHost是一個internal類,我相信NETCore團隊不希望大家隨意的去new它,而是通過WebHostBuilder去構(gòu)建。我們在這里訪問的WebHost實際上不是真正的WebHost,真正的WebHost在github的Hosting項目下,命名空間為:Microsoft.AspNetCore.Hosting.Internal。

在ASP.NET Core1x中,我們必須要自己創(chuàng)建WebHostBuilder。

var host = new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup<Startup>().Build();

這些默認(rèn)的動作未免有些繁瑣,后來到了ASP.NET Core2的時候創(chuàng)建了一個新的項目在github上,叫做MetaPackages?并在?Microsoft.AspNetCore的命名空間下創(chuàng)建了一個static class也就是我們現(xiàn)在用到的這個,里面主要的方法就是CreateDefaultBuilder。

CreateDefaultBuilder方法

這個方法負(fù)責(zé)返回給我們一個WebHostBuilder,?并且調(diào)用了以下擴展方法:

  • UseKestrel?使用kestrel server來處理請求

  • UseContentRoot?設(shè)置站點目錄?

  • ConfigureAppConfiguration

  • ConfigureLogging

其實和我們在1X的時候自己構(gòu)建是一個道理,而這些都是基于WebHostBuilder?的擴展方法它們來自于其它幾個不同的組件。

UseKestrel

WebHost負(fù)責(zé)托管ASP.NET Core,但是它并不真正從服務(wù)器網(wǎng)卡上監(jiān)聽端口以及將網(wǎng)絡(luò)字節(jié)轉(zhuǎn)換到.net core的管道。這些由IServer來處理。

這里先簡單了解一下這個過程,我們后面會在IServer的環(huán)節(jié)再詳述。我們這里使用的UseKestrel?來自于github上的項目 KestrelHttpServer。

里面的Kestrel項目下有一個WebHostBuilderKestrelExtensions類。里面就是這個 UseKestrel擴展方法的定義:

public static IWebHostBuilder UseKestrel( ? ?this IWebHostBuilder hostBuilder){ ? ?return hostBuilder.ConfigureServices(services =>{ ? ?// Don't override an already-configured transportservices.TryAddSingleton<ITransportFactory, SocketTransportFactory>();services.AddTransient<IConfigureOptions<KestrelServerOptions>, KestrelServerOptionsSetup>();services.AddSingleton<IServer, KestrelServer>();}); }

其實也很簡單,都是在進行Server依賴的配置,因為最終的執(zhí)行都由WebHost來展控。所以WebHost大量依賴的其它外部組件都被定義成接口放到了HttpAbstractions里面,然后由外部擴展方法(多以Use開頭,進行配置)

ASP.NET Core源碼里面大量使用擴展方法進行Servier DI的配置,擴展方法定義在各種不同的命名空間以及項目下。如果不習(xí)慣或者不了解相關(guān)的部分會覺得有些痛苦。

ConfigureAppConfiguration

這個方法專門用來為 WebHostBuilder添加配置,包括appsettings.json的、命令行參數(shù)以及環(huán)境變量。關(guān)于配置這一節(jié)我們留在后面具體來講。

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內(nèi)置組件中的很重要一個,這個方法在默認(rèn)已經(jīng)為我們添加了appsettings中的logging配置以及控制臺log。關(guān)于日志這一節(jié)我們留在后面具體來講。

logging.AddConfiguration( ? ? ? ?hostingContext.Configuration.GetSection("Logging"));logging.AddConsole();
logging.AddDebug();

UseStartup<>

Startup.cs這個類主要做兩件事情的配置Service DI和http管道,這些都是在WebHost啟動之前就需要確定下來的。而UseStartup就是將我們定義的Startup.cs和 IStartup綁定起來,讓W(xué)ebHost可以找得到。?怎么綁定呢??當(dāng)然還是依賴注入:

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默認(rèn)不繼續(xù)IStartup接口,所以是采用Convention的這種方式,當(dāng)然我們也可以繼承IStartup則直接注冊成單例到應(yīng)用程序。

以上是整個 WebHostBuilder的準(zhǔn)備階段,即往里面放了很多的參數(shù)。下一篇我們將接著講Builder階段,給了你那么多,你要開始制造點什么東西給我了

原文地址:http://www.jessetalk.cn/2017/11/11/aspnet-core-object-webhost/


.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com


總結(jié)

以上是生活随笔為你收集整理的我心中的ASP.NET Core 新核心对象WebHost(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。