电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過程解析

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

    ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過程

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

    一.創(chuàng)建默認(rèn)主機(jī)Host.CreateDefaultBuilder

    1.創(chuàng)建主機(jī)構(gòu)建器CreateHostBuilder(args)

    基于ASP.NET Core 5.0構(gòu)建的Web API項(xiàng)目的Program.cs文件大家應(yīng)該都很熟悉:

    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.創(chuàng)建默認(rèn)構(gòu)建器Host.CreateDefaultBuilder(args)

    本文重點(diǎn)講解下Host.CreateDefaultBuilder(args)的執(zhí)行過程,Microsoft.Extensions.Hosting.Host是一個(gè)靜態(tài)類,包含2個(gè)方法:

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

    上面的方法最終調(diào)用的還是下面的方法,下面的方法主要包括幾個(gè)部分:主機(jī)配置ConfigureHostConfiguration,應(yīng)用程序配置ConfigureAppConfiguration,日志配置ConfigureLogging,依賴注入配置UseDefaultServiceProvider。

    二.主機(jī)配置ConfigureHostConfiguration

    主機(jī)配置ConfigureHostConfiguration相關(guān)源碼如下:

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

    1.內(nèi)存配置源

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

    2.環(huán)境變量配置源

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

    3.命令行配置源

    最開始認(rèn)為參數(shù)args為null,經(jīng)過調(diào)試發(fā)現(xiàn)args的值string[0],并且args != null,所以會有命令行配置源CommandLineConfigurationSource。

    三.應(yīng)用程序配置ConfigureAppConfiguration

    應(yīng)用程序配置ConfigureAppConfiguration相關(guān)源碼如下:

    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.程序運(yùn)行的主機(jī)環(huán)境

    hostingContext.HostingEnvironment表示運(yùn)行程序的主機(jī)環(huán)境,比如開發(fā)環(huán)境或者生產(chǎn)環(huán)境。IHostEnvironment接口的數(shù)據(jù)結(jié)構(gòu)為:

    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,那么當(dāng)改變配置文件,應(yīng)用程序也會隨之更改而無需重啟。
    在該項(xiàng)目中總共有2個(gè)配置文件,分別是appsettings.json和appsettings.Development.json。

    3.添加用戶秘鑰配置源

    config.AddUserSecrets(appAssembly, optional: true)主要是在開發(fā)的過程中,用來保護(hù)配置文件中的敏感數(shù)據(jù)的,比如密碼等。因?yàn)槠綍r(shí)在開發(fā)中很少使用,所以在此不做深入討論,如果感興趣可參考[3]。

    四.日志配置ConfigureLogging

    日志配置ConfigureLogging相關(guān)源碼如下:

    .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不同的實(shí)現(xiàn)方式有:ConsoleLoggerProviderDebugLoggerProviderEventSourceLoggerProviderEventLogLoggerProviderTraceSourceLoggerProvider自定義。下面是日志配置涉及的相關(guān)代碼:

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

    說明:這一部分詳細(xì)的日志分析可以參考[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相關(guān)源碼如下:

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

    UseDefaultServiceProvider主要是設(shè)置默認(rèn)的依賴注入容器。

    參考文獻(xiàn):
    [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]認(rèn)識ASP.NET Core/Host及其配置解析:https://zhuanlan.zhihu.com/p/343312339
    [4]源碼解析.Net中Host主機(jī)的構(gòu)建過程: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啟動和運(yùn)行機(jī)制:https://www.jianshu.com/p/59cfaba4e2cb
    [10]ASP.Net Core解讀通用主機(jī)和托管服務(wù):https://www.cnblogs.com/qtiger/p/12976207.html

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

    標(biāo)簽: ASP
    主站蜘蛛池模板: 期货软件-专业期货分析软件下载-云智赢 | 立式_复合式_壁挂式智能化电伴热洗眼器-上海达傲洗眼器生产厂家 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 工控机-工业平板电脑-研华工控机-研越无风扇嵌入式box工控机 | 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 桁架楼承板-钢筋桁架楼承板-江苏众力达钢筋楼承板厂 | 柴油发电机组_柴油发电机_发电机组价格-江苏凯晨电力设备有限公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 旗杆生产厂家_不锈钢锥形旗杆价格_铝合金电动旗杆-上海锥升金属科技有限公司 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司_龙门加工中心-数控龙门加工中心厂家价格-山东海特数控机床有限公司 | 宜兴市恺瑞德环保科技有限公司| 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 六维力传感器_六分量力传感器_模腔压力传感器-南京数智微传感科技有限公司 | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 药品冷藏箱厂家_低温冰箱_洁净工作台-济南欧莱博电子商务有限公司官网 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 | 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 股指期货-期货开户-交易手续费佣金加1分-保证金低-期货公司排名靠前-万利信息开户 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 小型手持气象站-空气负氧离子监测站-多要素微气象传感器-山东天合环境科技有限公司 | 世纪豪门官网 世纪豪门集成吊顶加盟电话 世纪豪门售后电话 | 全自动端子机|刺破式端子压接机|全自动双头沾锡机|全自动插胶壳端子机-东莞市傅氏兄弟机械设备有限公司 | 国际线缆连接网 - 连接器_线缆线束加工行业门户网站 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 衬氟止回阀_衬氟闸阀_衬氟三通球阀_衬四氟阀门_衬氟阀门厂-浙江利尔多阀门有限公司 | 闸阀_截止阀_止回阀「生产厂家」-上海卡比阀门有限公司 | 闪蒸干燥机-喷雾干燥机-带式干燥机-桨叶干燥机-[常州佳一干燥设备] | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 背压阀|减压器|不锈钢减压器|减压阀|卫生级背压阀|单向阀|背压阀厂家-上海沃原自控阀门有限公司 本安接线盒-本安电路用接线盒-本安分线盒-矿用电话接线盒-JHH生产厂家-宁波龙亿电子科技有限公司 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | UV-1800紫外光度计-紫外可见光度计厂家-翱艺仪器(上海)有限公司 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 400电话_400电话申请_888元包年_400电话办理服务中心_400VIP网 | 淄博不锈钢无缝管,淄博不锈钢管-鑫门物资有限公司 |