成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

ASP.NET Core 5.0中的Host.CreateDefaultBuilder執行過程解析

瀏覽:162日期:2022-06-04 15:01:19
目錄
  • ASP.NET Core 5.0中的Host.CreateDefaultBuilder執行過程
  • 一.創建默認主機Host.CreateDefaultBuilder
    • 1.創建主機構建器CreateHostBuilder(args)
    • 2.創建默認構建器Host.CreateDefaultBuilder(args)
  • 二.主機配置ConfigureHostConfiguration
    • 1.內存配置源
    • 2.環境變量配置源
    • 3.命令行配置源
  • 三.應用程序配置ConfigureAppConfiguration
    • 1.程序運行的主機環境
    • 2.加載json配置文件
    • 3.添加用戶秘鑰配置源
  • 四.日志配置ConfigureLogging
    • 1.Windows日志級別
    • 2.日志的配置
    • 3.ActivityTrackingOptions
  • 五.依賴注入配置UseDefaultServiceProvider

    ASP.NET Core 5.0中的Host.CreateDefaultBuilder執行過程

    通過Rider調試的方式看了下ASP.NET Core 5.0的Web API默認項目,重點關注Host.CreateDefaultBuilder(args)中的執行過程,主要包括主機配置、應用程序配置、日志配置和依賴注入配置這4個部分。由于水平和篇幅有限,先整體理解、建立框架,后面再逐步細化,對每個配置部分再詳細拆解

    一.創建默認主機Host.CreateDefaultBuilder

    1.創建主機構建器CreateHostBuilder(args)

    基于ASP.NET Core 5.0構建的Web API項目的Program.cs文件大家應該都很熟悉:

    public class Program
    {
        public static void Main(string[] args)
        {
    CreateHostBuilder(args).Build().Run();
        }
    
        public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
    webBuilder.UseStartup<Startup>();
        });
    }

    2.創建默認構建器Host.CreateDefaultBuilder(args)

    本文重點講解下Host.CreateDefaultBuilder(args)的執行過程,Microsoft.Extensions.Hosting.Host是一個靜態類,包含2個方法:

    public static IHostBuilder CreateDefaultBuilder() =>CreateDefaultBuilder(args: null);
    public static IHostBuilder CreateDefaultBuilder(string[] args);

    上面的方法最終調用的還是下面的方法,下面的方法主要包括幾個部分:主機配置ConfigureHostConfiguration,應用程序配置ConfigureAppConfiguration,日志配置ConfigureLogging,依賴注入配置UseDefaultServiceProvider。

    二.主機配置ConfigureHostConfiguration

    主機配置ConfigureHostConfiguration相關源碼如下:

    builder.UseContentRoot(Directory.GetCurrentDirectory());
    builder.ConfigureHostConfiguration(config =>
    {
        config.AddEnvironmentVariables(prefix: "DOTNET_");
        if (args != null)
        {
    config.AddCommandLine(args);
        }
    });

    1.內存配置源

    Directory.GetCurrentDirectory()當前目錄指的就是D:\SoftwareProject\C#Program\WebApplication3\WebApplication3

    2.環境變量配置源

    config.AddEnvironmentVariables(prefix: "DOTNET_")添加了前綴為DOTNET_的環境變量。

    3.命令行配置源

    最開始認為參數args為null,經過調試發現args的值string[0],并且args != null,所以會有命令行配置源CommandLineConfigurationSource。

    三.應用程序配置ConfigureAppConfiguration

    應用程序配置ConfigureAppConfiguration相關源碼如下:

    builder.ConfigureAppConfiguration((hostingContext, config) =>
    {
        IHostEnvironment env = hostingContext.HostingEnvironment;
        bool reloadOnChange = hostingContext.Configuration.GetValue("hostBuilder:reloadConfigOnChange", defaultValue: true);
    
        config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: reloadOnChange).AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: reloadOnChange);
    
        if (env.IsDevelopment() && !string.IsNullOrEmpty(env.ApplicationName))
        {
    var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
    if (appAssembly != null)
    {
        config.AddUserSecrets(appAssembly, optional: true);
    }
        }
        config.AddEnvironmentVariables();
        if (args != null)
        {
    config.AddCommandLine(args);
        }
    })

    1.程序運行的主機環境

    hostingContext.HostingEnvironment表示運行程序的主機環境,比如開發環境或者生產環境。IHostEnvironment接口的數據結構為:

    public interface IHostEnvironment
    {
        // Development
        string EnvironmentName { get; set; }
        // WebApplication3
        string ApplicationName { get; set; }
        // D:\SoftwareProject\C#Program\WebApplication3\WebApplication3
        string ContentRootPath { get; set; }
        // PhysicalFileProvider
        IFileProvider ContentRootFileProvider { get; set; }
    }

    2.加載json配置文件

    接下來就是通過AddJsonFile()來添加配置文件了,如下所示:
    (1)Path(string):json文件的相對路徑位置。
    (2)Optional(bool):指定文件是否是必須的,如果為false,那么如果找不到文件就會拋出文件找不到異常。
    (3)ReloadOnchange(bool):如果為true,那么當改變配置文件,應用程序也會隨之更改而無需重啟。
    在該項目中總共有2個配置文件,分別是appsettings.json和appsettings.Development.json。

    3.添加用戶秘鑰配置源

    config.AddUserSecrets(appAssembly, optional: true)主要是在開發的過程中,用來保護配置文件中的敏感數據的,比如密碼等。因為平時在開發中很少使用,所以在此不做深入討論,如果感興趣可參考[3]。

    四.日志配置ConfigureLogging

    日志配置ConfigureLogging相關源碼如下:

    .ConfigureLogging((hostingContext, logging) =>
    {
        bool isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
        if (isWindows)
        {
    // Default the EventLogLoggerProvider to warning or above
    logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
        }
    
        logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
        logging.AddConsole();
        logging.AddDebug();
        logging.AddEventSourceLogger();
    
        if (isWindows)
        {
    // Add the EventLogLoggerProvider on windows machines
    logging.AddEventLog();
        }
    
        logging.Configure(options =>
        {
    options.ActivityTrackingOptions = ActivityTrackingOptions.SpanId
        | ActivityTrackingOptions.TraceId
        | ActivityTrackingOptions.ParentId;
        });
    })

    1.Windows日志級別

    從上述代碼中可以看到是LogLevel.Warning及以上。

    2.日志的配置

    ILoggerProvider不同的實現方式有:ConsoleLoggerProviderDebugLoggerProviderEventSourceLoggerProviderEventLogLoggerProviderTraceSourceLoggerProvider自定義。下面是日志配置涉及的相關代碼:

    logging.AddConsole(); //將日志輸出到控制臺
    logging.AddDebug(); //將日志輸出到調試窗口
    logging.AddEventSourceLogger();
    logging.AddEventLog();

    說明:這一部分詳細的日志分析可以參考[6]。

    3.ActivityTrackingOptions

    public enum ActivityTrackingOptions
    {
      None = 0, //No traces will be included in the log
      SpanId = 1, //The record will contain the Span identifier
      TraceId = 2, //The record will contain the tracking identifier
      ParentId = 4, //The record will contain the parent identifier
      TraceState = 8, //The record will contain the tracking status
      TraceFlags = 16, //The log will contain trace flags
    }

    在最新的.NET 7 Preview6中又增加了Tags(32)和Baggage(64)。

    五.依賴注入配置UseDefaultServiceProvider

    依賴注入配置UseDefaultServiceProvider相關源碼如下:

    .UseDefaultServiceProvider((context, options) =>
    {
        bool isDevelopment = context.HostingEnvironment.IsDevelopment();
        options.ValidateScopes = isDevelopment;
        options.ValidateOnBuild = isDevelopment;
    });

    UseDefaultServiceProvider主要是設置默認的依賴注入容器。

    參考文獻:
    [1].NET Source Browser:https://source.dot.net/
    [2]Safe storage of app secrets in development in ASP.NET Core:https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-6.0&tabs=windows
    [3]認識ASP.NET Core/Host及其配置解析:https://zhuanlan.zhihu.com/p/343312339
    [4]源碼解析.Net中Host主機的構建過程:https://www.cnblogs.com/snailZz/p/15240616.html
    [5].NET Core通用Host源碼分析:https://www.cnblogs.com/yingbiaowang/p/15048495.html
    [6]基于.NetCore3.1系列--日志記錄之日志配置揭秘:https://www.cnblogs.com/i3yuan/p/13411793.html
    [7]基于.NetCore3.1系列--日志記錄之日志核心要素揭秘:https://www.cnblogs.com/i3yuan/p/13442509.html
    [8].NET5中Host.CreateDefaultBuilder(args)詳解:https://blog.csdn.net/qbc12345678/article/details/122983855
    [9]ASP.NET啟動和運行機制:https://www.jianshu.com/p/59cfaba4e2cb
    [10]ASP.Net Core解讀通用主機和托管服務:https://www.cnblogs.com/qtiger/p/12976207.html

    到此這篇關于ASP.NET Core 5.0中的Host.CreateDefaultBuilder執行過程解析的文章就介紹到這了,更多相關ASP.NET Core 5.0 Host.CreateDefaultBuilder執行過程內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

    標簽: ASP
    成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
    欧美精品网站| 亚洲乱码中文字幕| 久久精品免视看| 九九在线精品视频| 黑人一区二区三区四区五区| 欧美精品一区二区在线播放| 国产一区二区电影| 色欧美片视频在线观看在线视频| 亚洲一卡二卡三卡四卡| 亚洲欧洲一区二区天堂久久| 国产精品久久国产精麻豆99网站| av一二三不卡影片| 欧美mv日韩mv亚洲| 成人小视频在线| 日韩三级中文字幕| 国产成人亚洲综合色影视| 欧美日韩dvd在线观看| 免费av网站大全久久| 91黄色免费网站| 亚洲一级不卡视频| 亚洲一区二区三区高清| 亚洲国产sm捆绑调教视频| 国产精品日韩久久久| 一区二区三区四区不卡视频| 亚洲深爱激情| 亚洲123区在线观看| 免费在线亚洲| 丝袜美腿亚洲色图| 色噜噜偷拍精品综合在线| 男男视频亚洲欧美| 欧美久久久久久蜜桃| 国产精品亚洲一区二区三区妖精| 欧美一级黄色大片| www.欧美.com| 国产亚洲女人久久久久毛片| 欧美日韩一区在线观看视频| 国产精品夫妻自拍| 亚洲国产欧美日韩| 一个色综合av| 色综合久久久久综合体| 老司机精品视频导航| 91精品国产入口| a级高清视频欧美日韩| 久久午夜色播影院免费高清| 国产一区二区三区四区老人| 成人免费在线视频观看| 日韩一级不卡| 五月婷婷色综合| 欧美日韩一级二级三级| 黄色精品一二区| 精品免费视频.| 国模 一区 二区 三区| 一区二区三区丝袜| 在线观看三级视频欧美| 高清免费成人av| 亚洲国产精品传媒在线观看| 一本色道久久综合亚洲精品不卡| 日本午夜精品一区二区三区电影| 91精品国产综合久久福利软件| 欧美激情1区| 亚洲一区二区高清| 欧美人xxxx| 欧美私人啪啪vps| 天天av天天翘天天综合网色鬼国产 | 日韩一区二区三免费高清| 亚洲欧洲精品天堂一级| 一本色道久久综合亚洲精品按摩| 国产乱对白刺激视频不卡| 欧美韩日一区二区三区四区| 国产精品日本欧美一区二区三区| 日本欧美加勒比视频| 欧美一区二区大片| 91久久精品国产91久久性色tv| 日韩精品1区2区3区| 欧美电影免费观看完整版| 亚洲一级网站| 日韩av高清在线观看| 久久综合资源网| 99视频日韩| 久久99久久99小草精品免视看| 久久亚洲综合色一区二区三区| 91久久极品少妇xxxxⅹ软件| 日精品一区二区三区| 精品国产乱码久久久久久久久| 在线不卡欧美| 久久精品国产成人一区二区三区| 国产欧美日韩精品a在线观看| 国产精品主播| 国产成人av一区| 亚洲精品五月天| 67194成人在线观看| 91麻豆精品在线观看| 午夜激情一区二区| 精品sm在线观看| 国产欧美日韩综合一区在线播放| 国产精品白丝av| 国产精品福利一区| 欧美久久久一区| 一本久道久久综合狠狠爱| 国产传媒一区在线| 亚洲综合视频网| 337p粉嫩大胆噜噜噜噜噜91av| 一本高清dvd不卡在线观看| 午夜天堂精品久久久久| 久久国产乱子精品免费女| 亚洲国产经典视频| 欧美日免费三级在线| 亚洲性感美女99在线| 精品一区二区日韩| 亚洲蜜臀av乱码久久精品| 日韩一级免费观看| 久久综合福利| 国产精品v欧美精品v日韩精品 | 成人av在线资源网| 亚洲一区在线看| 精品福利av导航| 色香蕉成人二区免费| 欧美女人交a| 国产在线日韩欧美| 亚洲一区二区三区精品在线| 日韩欧美一级二级三级久久久| 性刺激综合网| 欧美日韩国产亚洲一区| 国产一区二区在线视频| 亚洲影视在线播放| 国产婷婷精品av在线| 欧美色综合网站| 国产精品伊人日日| 国语精品一区| 99久久精品国产一区二区三区 | 专区另类欧美日韩| 欧美电视剧免费观看| 色菇凉天天综合网| 亚洲国产专区校园欧美| 99re这里只有精品首页| 国产精品18久久久久久久久| 日韩精品一区第一页| 亚洲欧美一区二区三区久本道91| 2欧美一区二区三区在线观看视频| 欧美日精品一区视频| 快she精品国产999| 国产视频精品网| 好吊色欧美一区二区三区四区| 懂色一区二区三区免费观看| 日韩国产一区二| 亚洲女厕所小便bbb| 久久久久97国产精华液好用吗| 91精品国产欧美一区二区18| 欧美高清不卡| 成人福利在线看| 国产精品一区在线| 国产自产视频一区二区三区| 人妖欧美一区二区| 天堂蜜桃一区二区三区| 亚洲精品免费播放| 亚洲欧美自拍偷拍色图| 国产精品色哟哟| 日本一区二区视频在线观看| 精品国产伦一区二区三区观看体验| 欧美一区二区精品| 欧美一区二区三区啪啪| 884aa四虎影成人精品一区| 欧美午夜精品电影| 色婷婷狠狠综合| 色综合久久天天综合网| 久久精品一区| 久久riav二区三区| 亚洲一区综合| 亚洲永久免费精品| 国产精品久久波多野结衣| 国产一区二区久久久| 99精品久久久| 国产欧美日韩综合一区在线播放| 99精品99| 国产精品久久久久久模特| 夜夜嗨一区二区三区| 亚洲一区国产| 老牛嫩草一区二区三区日本| 久久资源在线| 欧美日韩一区二区三区四区 | 欧美丰满美乳xxx高潮www| 91精品免费在线观看| 欧美精品丝袜久久久中文字幕| 欧美亚洲精品一区| 欧美精品第1页| 日韩午夜精品电影| 久久新电视剧免费观看| 国产精品欧美经典| 亚洲三级免费电影| 一区二区欧美在线观看| 性做久久久久久久免费看| 日韩精品成人一区二区在线| 久久激情综合网| 国产经典欧美精品| 99久久久精品| 欧美日韩国产综合网| 亚洲福利免费| 亚洲欧美日本日韩| 欧美专区在线观看一区| 3d动漫精品啪啪1区2区免费|