版本: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. Redis之分布式锁实现

    点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的 ...

  2. AWS 创建redis 集群模式遇到的问题

    问题描述 前几天在aws 平台创建了Redis 集群模式,但是链接集群的时候发现无法连接,返回信息超时. 通过参数组创建redis的时候提示报错:Replication group with spec ...

  3. Android开发项目中常用到的开源库

    圆形头像 https://github.com/hdodenhof/CircleImageView ButterKnife https://github.com/JakeWharton/butterk ...

  4. 简单说维特比算法 - python实现

    动态规划求最短路径算法,与穷举法相比优点在于大大降低了时间复杂度; 假如从起点A到终点S的最短路径Road经过点B1,那么从起点A到B1的最短路径的终点就是B1,否则如果存在一个B2使得A到B2的距离 ...

  5. MYSQL 实现ROWNO功能

    select tt.rowno  from( select (@rownum:=@rownum+1) as rowno, t.id    from news t ,(select (@rownum : ...

  6. LOJ 3045: 洛谷 P5326: 「ZJOI2019」开关

    题目传送门:LOJ #3045. 题意简述 略. 题解 从高斯消元出发好像需要一些集合幂级数的知识,就不从这个角度思考了. 令 \(\displaystyle \dot p = \sum_{i = 1 ...

  7. [PyQt5]文件对话框QFileDialog的使用

    概述选取文件夹 QFileDialog.getExistingDirectory()选择文件 QFileDialog.getOpenFileName()选择多个文件 QFileDialog.getOp ...

  8. 2019-02-05 Linux的一些常用命令学习2

    黑马程序员python课的笔记 ls -l 显示文件详细信息 ls -l -h 以k形式显示大小 ls -a 显示指定目录下的所有子目录和文件,包括隐藏文件 ls匹配符 *代表任意个数的字符 ?代表任 ...

  9. 附024.Kubernetes_v1.18.3高可用部署架构二

    kubeadm介绍 kubeadm概述 参考<附003.Kubeadm部署Kubernetes>. kubeadm功能 参考<附003.Kubeadm部署Kubernetes> ...

  10. BUAA_OO_2020_Unit1_总结博客

    BUAA_OO_2020_Unit1_总结 2020年春季学期第四周,OO第一单元落下帷幕,几多欢喜几多愁,现做如下总结(按每次作业的递进顺序) 一.第一次作业(基础的幂函数求导) 基于度量的程序结构 ...