dotNetCore閱讀源碼-CreateDefaultBuilder及ConfigureWebHostDefaults內部


版本:DotNetCore 3.1

CreateDefaultBuilder內部源碼:

 public static IHostBuilder CreateDefaultBuilder(string[] args)
        {
            //實例化
            var builder = new HostBuilder();

            //指定主機要使用的內容根目錄。
            builder.UseContentRoot(Directory.GetCurrentDirectory());
           //設置生成器自身的配置
            builder.ConfigureHostConfiguration(config =>
            {
                //環境變量必須以DOTNET_為前綴開頭,並且前綴將從環境變量名稱中刪除。
                //默認配置會加載前綴為 DOTNET_ 和 ASPNETCORE_ 的環境變量和命令行參數。
                //DOTNET_ 和 ASPNETCORE_ 前綴會由 ASP.NET Core 用於主機和應用配置,但不用於用戶配置.
                //前綴會在讀取配置鍵值對時被去除。
                config.AddEnvironmentVariables(prefix: "DOTNET_");
                //如果傳入的參數不為空
                if (args != null)
                {
                    //將參數添加配置 這里可以執行一些cmd命令
                    //例如發布MVC到IIS,將web.config 內部的
                    //<aspNetCore processPath="dotnet" arguments = ".\MyApp.dll" stdoutLogEnabled = "false" stdoutLogFile = ".\logs\stdout" hostingModel = "inprocess" />
                    //作為參數命令  dotnet  MyApp.dll 執行 
                    config.AddCommandLine(args);
                }
            });

       //為生成過程和應用程序的其余部分設置配置
            builder.ConfigureAppConfiguration((hostingContext, config) =>
            {
                //獲取主機環境
                var env = hostingContext.HostingEnvironment;
                //獲取appsettings.json    appsettings.xxx.json文件
                //注意如果參數名相同,appsettings.xxx.json會覆蓋appsetting.json的參數變量
                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)
                    {
                        //添加用戶秘鑰
                        //若使用該配置可查看https://docs.microsoft.com/zh-cn/aspnet/core/security/app-secrets?view=aspnetcore-3.1&tabs=windows
                        config.AddUserSecrets(appAssembly, optional: true);
                    }
                }

                //指定環境變量的前綴
                //例如config.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
                //測試:
                //set MyCustomPrefix_MyKey="My key with MyCustomPrefix_ Environment"
                //set MyCustomPrefix_Position__Title = Editor_with_customPrefix
                //set MyCustomPrefix_Position__Name = Environment_Rick_cp
                //dotnet run
                config.AddEnvironmentVariables();

                if (args != null)
                {   //將參數添加配置 這里可以執行一些cmd命令
                    //例如發布MVC到IIS,將web.config 內部的
                    //<aspNetCore processPath="dotnet" arguments = ".\MyApp.dll" stdoutLogEnabled = "false" stdoutLogFile = ".\logs\stdout" hostingModel = "inprocess" />
                    //作為參數命令執行  dotnet  MyApp.dll
                    config.AddCommandLine(args);
                }
            })
            .ConfigureLogging((hostingContext, logging) =>
            {
                //默認日志
                var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);

                //重要提示:
                //這需要在配置被加載之前被添加,
                //這使得默認值將被配置覆蓋。
                if (isWindows)
                {
                    //將EventLogLoggerProvider的默認值設置為警告或更高
                    logging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);
                }
                //獲取appsettings.json 或者appsettings.xxx.json文件內的Logging參數
                logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                //添加控制台打印
                logging.AddConsole();
                //添加Debug的調試記錄器。
                logging.AddDebug();
                //添加事件源記錄器
                logging.AddEventSourceLogger();

                if (isWindows)
                {
                    // 在Windows機器上添加EventLogLoggerProvider
                    logging.AddEventLog();
                }
            })
            .UseDefaultServiceProvider((context, options) =>
            {
                //作用域驗證
                //如果應用環境為開發,則將ValidateScopes 設為 true。
                var isDevelopment = context.HostingEnvironment.IsDevelopment();
                //ValidateScopes執行檢查以驗證范圍內的服務永遠不會從根提供程序解析,則為 true;否則為 false。 默認為 false。
                options.ValidateScopes = isDevelopment;
                //若要執行檢查,驗證是否可在 BuildServiceProvider(IServiceCollection, ServiceProviderOptions) 調用期間創建所有服務,是則為 true;
                //否則為 false。 默認為 false。 注意:此檢查不會驗證開放式泛型服務。
                options.ValidateOnBuild = isDevelopment;
            });

            return builder;
        }

 

ConfigureWebHostDefaults內部源碼:

 

   public static IHostBuilder ConfigureWebHostDefaults(this IHostBuilder builder, Action<IWebHostBuilder> configure)
        {
           
            return builder.ConfigureWebHost(webHostBuilder =>
            {
                //2.1版本之前的調用方式
                //注意這是webhost不是host
                WebHost.ConfigureWebDefaults(webHostBuilder);

                configure(webHostBuilder);
            });
        }

        ///以下默認值應用於IWebHostBuilder:
        ///使用Kestrel作為網絡服務器,並使用應用程序的配置提供程序對其進行配置,
        ///添加HostFiltering中間件,
        ///如果ASPNETCORE_FORWARDEDHEADERS_ENABLED = true,則添加ForwardedHeaders中間件,
        ///並啟用IIS集成。
        internal static void ConfigureWebDefaults(IWebHostBuilder builder)
        {
            builder.ConfigureAppConfiguration((ctx, cb) =>
            {
                if (ctx.HostingEnvironment.IsDevelopment())
                {
                    StaticWebAssetsLoader.UseStaticWebAssets(ctx.HostingEnvironment, ctx.Configuration);
                }
            });
            builder.UseKestrel((builderContext, options) =>
            {
                options.Configure(builderContext.Configuration.GetSection("Kestrel"));
            })
            .ConfigureServices((hostingContext, services) =>
            {
                // Fallback
                services.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[] { "*" });
                    }
                });
                // 變更通知
                services.AddSingleton<IOptionsChangeTokenSource<HostFilteringOptions>>(
                            new ConfigurationChangeTokenSource<HostFilteringOptions>(hostingContext.Configuration));

                services.AddTransient<IStartupFilter, HostFilteringStartupFilter>();
                // 如果ASPNETCORE_FORWARDEDHEADERS_ENABLED = true,則添加ForwardedHeaders中間件,
                if (string.Equals("true", hostingContext.Configuration["ForwardedHeaders_Enabled"], StringComparison.OrdinalIgnoreCase))
                {
                    services.Configure<ForwardedHeadersOptions>(options =>
                    {
                        options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
                        //默認情況下僅允許使用環回代理。 清除該限制,因為轉發器是
                        //通過顯式配置啟用。
                        options.KnownNetworks.Clear();
                        options.KnownProxies.Clear();
                    });

                    services.AddTransient<IStartupFilter, ForwardedHeadersStartupFilter>();
                }
                //添加路由服務
                services.AddRouting();
            })

            //在IIS發布的時候需要AspNetCoreModule
            //配置在AspNetCoreModule后面運行時服務器應偵聽的端口和基本路徑。
            //該應用程序還將配置為捕獲啟動錯誤。
            .UseIIS()
            .UseIISIntegration();//啟用IIS集成。
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM