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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

跟我一起学.NetCore之Asp.NetCore启动流程浅析

發(fā)布時間:2023/12/4 asp.net 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 跟我一起学.NetCore之Asp.NetCore启动流程浅析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

一個Asp.NetCore項目,知道大概的啟動流程是有必要的,比如后續(xù)遇見配置信息覆蓋等相關問題時也大概知道是什么原因,了解原因之后,再去搜索引擎找答案,否則目標不明確,茫茫人海怎么會一下找到自己想要的,除非是“偶遇”;“偶遇”太難,一起淺析一個Asp.NetCore 項目的啟動流程;

正文

先創(chuàng)建一個WebAPI項目,用的是.NetCore3.1,后續(xù)的項目例子都統(tǒng)一用.NetCore3.1,除非特殊說明;項目如下:

如上圖所示,一個WebAPI項目啟動方式本質也是一個控制臺程序,程序入口都是從Main函數(shù)開始,就從里面方法看看大概都做了什么,其中擇取幾個方法源碼簡要說明主要功能,通過增加代碼注釋的方式(我覺得這樣比較方便對應瀏覽),完整源代碼從以下兩個地址獲取,通過Everything查找工具比較方便查詢代碼:

主項目地址:https://github.com/dotnet/aspnetcore/tree/v3.1.0?

擴展項目地址:https://github.com/dotnet/extensions/releases/tag/v3.1.6

GitHub代碼地址

1. Host.CreateDefaultBuilder方法

public static IHostBuilder CreateDefaultBuilder(string[] args) {//實例化一個HostBuildervar builder = new HostBuilder();//設置根目錄builder.UseContentRoot(Directory.GetCurrentDirectory());//設置?Host相關配置的配置源builder.ConfigureHostConfiguration(config =>{//從環(huán)境變量中獲取,前綴名為DOTNET_config.AddEnvironmentVariables(prefix: "DOTNET_");//如果命令行中有參數(shù),可從命令行中讀取if (args != null){config.AddCommandLine(args);}});//設置應用程序配置的配置源builder.ConfigureAppConfiguration((hostingContext, config) =>{var env = hostingContext.HostingEnvironment;//根據(jù)運行環(huán)境加載不同的配置文件,并開啟了熱更新config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);if (env.IsDevelopment() && !string.IsNullOrEmpty(env.ApplicationName)){var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));if (appAssembly != null){config.AddUserSecrets(appAssembly, optional: true);}}//可從環(huán)境變量中獲取config.AddEnvironmentVariables();//如果命令行中有參數(shù),可從命令行中讀取if (args != null){config.AddCommandLine(args);}})//配置日志顯示.ConfigureLogging((hostingContext, logging) =>{//判斷操作系統(tǒng)var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);//如果是Windows系統(tǒng),配置對應的顯示級別//IMPORTANT: This needs to be added *before* configuration is loaded, this lets//the defaults be overridden by the configuration.if (isWindows){// Default the EventLogLoggerProvider to warning or abovelogging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);}//獲取配置文件中Logging 段相關的配置信息添加到日志配置中l(wèi)ogging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));//在控制臺輸出,所以啟動程序的時候就看見輸出日志logging.AddConsole();//在Debug窗口輸出logging.AddDebug();logging.AddEventSourceLogger();//如果是Windows系統(tǒng),可以在系統(tǒng)日志中輸出日志if (isWindows){// Add the EventLogLoggerProvider on windows machineslogging.AddEventLog();}})//使用默認的依賴注入容器.UseDefaultServiceProvider((context, options) =>{var isDevelopment = context.HostingEnvironment.IsDevelopment();options.ValidateScopes = isDevelopment;options.ValidateOnBuild = isDevelopment;});return builder; }

2. ConfigureWebHostDefaults 方法

public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder, Action<IWebHostBuilder> configure) {return builder.ConfigureWebHost(webHostBuilder =>{//指定是用的服務器及集成一些默認管道WebHost.ConfigureWebDefaults(webHostBuilder);//調(diào)用傳入的委托,這里是外部指定Startup類做服務注冊和管道配置configure(webHostBuilder);}); }

2.1 ?WebHost.ConfigureWebDefaults方法

internal static void ConfigureWebDefaults(IWebHostBuilder builder) {builder.ConfigureAppConfiguration((ctx, cb) =>{if (ctx.HostingEnvironment.IsDevelopment()){//靜態(tài)文件環(huán)境的配置啟用StaticWebAssetsLoader.UseStaticWebAssets(ctx.HostingEnvironment, ctx.Configuration);}});//指定Kestrel作為默認的Web服務器builder.UseKestrel((builderContext, options) =>{options.Configure(builderContext.Configuration.GetSection("Kestrel"));})// 服務中間的注冊,包含路的中間件注冊.ConfigureServices((hostingContext, services) =>{// 針對配置節(jié)點AllowedHosts改變時的回調(diào)// Fallbackservices.PostConfigure<HostFilteringOptions>(options =>{if (options.AllowedHosts == null || options.AllowedHosts.Count == 0){// "AllowedHosts": "localhost;127.0.0.1;[::1]"var hosts = hostingContext.Configuration["AllowedHosts"]?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);// Fall back to "*" to disable.options.AllowedHosts = (hosts?.Length > 0 ? hosts : new[] { "*" });}});//對應配置改變時觸發(fā)通知// Change notificationservices.AddSingleton<IOptionsChangeTokenSource<HostFilteringOptions>>(new ConfigurationChangeTokenSource<HostFilteringOptions>(hostingContext.Configuration));services.AddTransient<IStartupFilter, HostFilteringStartupFilter>();if (string.Equals("true", hostingContext.Configuration["ForwardedHeaders_Enabled"], StringComparison.OrdinalIgnoreCase)){services.Configure<ForwardedHeadersOptions>(options =>{options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;// Only loopback proxies are allowed by default. Clear that restriction because forwarders are// being enabled by explicit configuration.options.KnownNetworks.Clear();options.KnownProxies.Clear();});services.AddTransient<IStartupFilter, ForwardedHeadersStartupFilter>();}services.AddRouting();})//對使用IIS相關中間件.UseIIS().UseIISIntegration(); }

3. Build方法,其實這個方法就是根據(jù)之前配置構造出一個IHost對象

public IHost Build() {if (_hostBuilt){throw new InvalidOperationException("Build can only be called once.");}_hostBuilt = true;//執(zhí)行ConfigureHostConfiguration添加的一系列配置回調(diào)方法BuildHostConfiguration();//運行環(huán)境相關創(chuàng)建,如ApplicationName、EnvironmentName、ContentRootPath等CreateHostingEnvironment();//構建HostBuilderCreateHostBuilderContext();//執(zhí)行ConfigureAppConfigureation添加的一系列配置回調(diào)方法BuildAppConfiguration();//注入默認服務如:IHost、ILogging等,執(zhí)行ConfigureServices添加的一系列回調(diào)方法CreateServiceProvider();return _appServices.GetRequiredService<IHost>(); }

4. Run()方法,開啟服務器,之后就可以進行請求了

綜上幾個關鍵方法,從其中Host這個關鍵詞出現(xiàn)很多次,其實在Asp.Net Core應用中是通過配置并啟動一個Host來完成應用程序的啟動和生命周期的管理。而Host主要就是對Web Server的配置和請求處理管理的管理,簡要流程如下圖:

在整個啟動流程中,返回的IHostBuilder中暴露配置和注入的相關接口,可用于自己定義擴展,接下來通過打印的方式來看看一下幾個暴露方法的執(zhí)行順序,其實以上Build方法的時候已經(jīng)明確了對應方法的順序;

改造代碼如下:

Startup方法中的三個方法也增加對應的打印,運行如下:

如上圖,除了Startup中的ConfigureServices會跟隨ConfigureWebHostDefaults改變以外,其他方法順序都是固定。那這些方法主要作用都是什么呢?如下圖:

圖中Program.ConfigureServices和Startup.ConfigureServices的執(zhí)行順序會根據(jù)ConfigureWebHostDefaults的位置改變會交替變動;

總結

以上內(nèi)容只是提取了其中比較關鍵的流程進行說明,并沒有詳細解析源代碼,這里只是先淺析,后續(xù)再繼續(xù)一起深究源代碼;下一節(jié)說說依賴注入;

總結

以上是生活随笔為你收集整理的跟我一起学.NetCore之Asp.NetCore启动流程浅析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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