版本: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 == )
{
// "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 > ? 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集成。
}

dotNetCore阅读源码-CreateDefaultBuilder及ConfigureWebHostDefaults内部的更多相关文章

  1. 学会阅读源码后,我觉得自己better了

    我有一个大学同学,名叫石磊,我在之前的文章里提到过几次,我们俩合作过很多项目.只要有他在,我就特别放心,因为几乎所有难搞的问题,到他这,都能够巧妙地化解.他给我印象最深刻的一句话就是,"有啥 ...

  2. 从SpringBoot启动,阅读源码设计

    目录 一.背景说明 二.SpringBoot工程 三.应用上下文 四.资源加载 五.应用环境 六.Bean对象 七.Tomcat服务 八.事件模型 九.配置加载 十.数据库集成 十一.参考源码 服务启 ...

  3. 【转】使用 vim + ctags + cscope + taglist 阅读源码

    原文网址:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找 ...

  4. Spring源码解析——如何阅读源码(转)

    最近没什么实质性的工作,正好有点时间,就想学学别人的代码.也看过一点源码,算是有了点阅读的经验,于是下定决心看下spring这种大型的项目的源码,学学它的设计思想. 手码不易,转载请注明:xingoo ...

  5. Spring源码解析——如何阅读源码

    最近没什么实质性的工作,正好有点时间,就想学学别人的代码.也看过一点源码,算是有了点阅读的经验,于是下定决心看下spring这种大型的项目的源码,学学它的设计思想. 手码不易,转载请注明:xingoo ...

  6. 阅读源码(III)

    往期系列: <由阅读源码想到> <由阅读源码想到 | 下篇> Medium上有一篇文章Why You Don't Deserve That Dream Developer Jo ...

  7. 阅读源码(IV)

    往期系列: <由阅读源码想到> <由阅读源码想到 | 下篇> <阅读源码(III)> Eric S.Raymond的写于2014年的<How to learn ...

  8. How Tomcat works — 一、怎样阅读源码

    在编程的道路上,通过阅读优秀的代码来提升自己是很好的办法.一直想阅读一些开源项目,可是没有合适的机会开始.最近做项目的时候用到了shiro,需要做集群的session共享,经过查找发现tomcat的s ...

  9. 使用 vim + ctags + cscope + taglist 阅读源码

    转自:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找到合 ...

随机推荐

  1. 【Flutter实战】移动技术发展史

    老孟导读:大家好,这是[Flutter实战]系列文章的第一篇,这并不是一篇Flutter技术文章,而是介绍智能手机操作系统.跨平台技术的演进以及我对各种跨平台技术看法的文章. 智能手机操作系统 塞班( ...

  2. Python + MySQL 批量查询百度收录

    做SEO的同学,经常会遇到几百或几千个站点,然后对于收录情况去做分析的情况 那么多余常用的一些工具在面对几千个站点需要去做收录分析的时候,那么就显得不是很合适. 在此特意分享给大家一个批量查询百度收录 ...

  3. javascript 面向对象学习(一)——构造函数

    最近在学习设计模式,找了很多资料也没有看懂,看到怀疑智商,怀疑人生,思来想去还是把锅甩到基础不够扎实上.虽然原型继承.闭包.构造函数也都有学习过,但理解得不够透彻,影响到后续提高.这次重新开始学习,一 ...

  4. CSS里盒子模型中【margin垂直方向边界叠加】问题及解决方案

    边界重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容.补白.边框)重合在一起而形成一个单一边界. 两个或多个块级盒子的垂直相邻边界会重合. 如果都是正边界,结果的边界宽度是 ...

  5. Nice Jquery Validator DOM 绑定

    针对表单的绑定 示例:在 form 上绑定 data-validator-option 来配置参数 <form data-validator-option='{stopOnError:false ...

  6. @atcoder - ARC092F@ Two Faced Edges

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给出一个有向图,对每条边都做一次询问: 翻转这条边后,对原图的强 ...

  7. tomcat的安装部署(windows10)

    一.Tomact下载 地址:https://tomcat.apache.org/

  8. 用字典优化过长的if 语句

    如果代码中,if 语句,后面elif 过多,完全可以用字典来优化代码. def response(method): if method == "POST": return &quo ...

  9. 深度解密 Go 语言之 sync.map

    工作中,经常会碰到并发读写 map 而造成 panic 的情况,为什么在并发读写的时候,会 panic 呢?因为在并发读写的情况下,map 里的数据会被写乱,之后就是 Garbage in, garb ...

  10. 《Java并发编程的艺术》第4章 Java并发编程基础 ——学习笔记

    参考https://www.cnblogs.com/lilinzhiyu/p/8086235.html 4.1 线程简介 进程:操作系统在运行一个程序时,会为其创建一个进程. 线程:是进程的一个执行单 ...