版本: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集成。 }