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 == )
{
// "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内部的更多相关文章
- 学会阅读源码后,我觉得自己better了
我有一个大学同学,名叫石磊,我在之前的文章里提到过几次,我们俩合作过很多项目.只要有他在,我就特别放心,因为几乎所有难搞的问题,到他这,都能够巧妙地化解.他给我印象最深刻的一句话就是,"有啥 ...
- 从SpringBoot启动,阅读源码设计
目录 一.背景说明 二.SpringBoot工程 三.应用上下文 四.资源加载 五.应用环境 六.Bean对象 七.Tomcat服务 八.事件模型 九.配置加载 十.数据库集成 十一.参考源码 服务启 ...
- 【转】使用 vim + ctags + cscope + taglist 阅读源码
原文网址:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找 ...
- Spring源码解析——如何阅读源码(转)
最近没什么实质性的工作,正好有点时间,就想学学别人的代码.也看过一点源码,算是有了点阅读的经验,于是下定决心看下spring这种大型的项目的源码,学学它的设计思想. 手码不易,转载请注明:xingoo ...
- Spring源码解析——如何阅读源码
最近没什么实质性的工作,正好有点时间,就想学学别人的代码.也看过一点源码,算是有了点阅读的经验,于是下定决心看下spring这种大型的项目的源码,学学它的设计思想. 手码不易,转载请注明:xingoo ...
- 阅读源码(III)
往期系列: <由阅读源码想到> <由阅读源码想到 | 下篇> Medium上有一篇文章Why You Don't Deserve That Dream Developer Jo ...
- 阅读源码(IV)
往期系列: <由阅读源码想到> <由阅读源码想到 | 下篇> <阅读源码(III)> Eric S.Raymond的写于2014年的<How to learn ...
- How Tomcat works — 一、怎样阅读源码
在编程的道路上,通过阅读优秀的代码来提升自己是很好的办法.一直想阅读一些开源项目,可是没有合适的机会开始.最近做项目的时候用到了shiro,需要做集群的session共享,经过查找发现tomcat的s ...
- 使用 vim + ctags + cscope + taglist 阅读源码
转自:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找到合 ...
随机推荐
- [寒假学习]ps知识
小学就开始学了,还是要感谢当时年轻不懂事到处研究怎么画画哈哈哈哈,不过到现在有点忘,寒假在家禁足也无聊,寻思着重拾画笔来着,复习一下,冲! 为了防止看完就忘用博客记录一下小笔记 1. 一些快捷键的 ...
- Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?
原作:Jake Edge 译者:豌豆花下猫@Python猫 英文:https://lwn.net/Articles/819853/ 随着 Python 3.9.0b1 的发布,即开发周期中计划的四个 ...
- 基于使用ISCSI存储的ibmmq通过heartbeat实现HA方案以及碰到的问题总结
一.背景 ibmmq是一种传统架构的mq产品,运行稳定,有其自身优点,但在高可用(HA)这一块需要使用公司根据自身需求选用高可用(HA)产品,但由于市面HA商业产品较贵,所以使用linux操作系统级的 ...
- centos7下docker的安装教程
Centos7下docker安装教程以及踩过的那些坑 推荐在Centos下安装docker,在windows下安装docker可能会遇到很多的问题,而且docker官方推荐使用linux环境来使用do ...
- @gym - 100591D@ Fox Rocks
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 个点以及 P 条单向道路 Ai -> Bi,每条 ...
- Flutter学习笔记(35)--通知Notification
如需转载,请注明出处:Flutter学习笔记(35)--通知Notification 通知的NotificationListener和我们之前写的事件的Listener一样,都是功能性的组件,而且也都 ...
- Latex文件本机能正常编译,但在另一台电脑不能编译的解决方法
问题:同样的文件在台式机能编译出正常的PDF文件,但发现在另一个电脑上不能编译出PDF文件. \documentclass[preprint,10pt,5p,times,twocolumn]{elsa ...
- Linux中bash的一些命令
Linux——bash的简单使用 bash及其特性: 1.bash实质上是一个可执行的程序,一个用户的工作环境. 2.每一个shell下可以再打开一个shell,新打开的shell称为子shell,每 ...
- 搜索引擎-SHODAN
shodan这个搜索引擎不会爬取网页内容,而是爬取所有的联网设备. 这个搜索引擎还是很强大的,下图就是我用shodan查自己的案例服务器的结果: 如图,可以查到这台服务器安装了wdcp管理面板,黑客完 ...
- Django REST Framework(一) Serializer和ModelSerializer
REST Framework概述 Django REST framework是一套基于Django的REST框架,是一个用于构建Web API的功能强大且灵活的工具包. 1.RESTful 简述Rep ...