版本: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. 构造函数继承与class继承

    构造函数继承 1.子类通过apply方法或者call方法把this指向父类 js代码 function Parent(name, age) { this.name = name this.age = ...

  2. web静态页面资源访问路径问题

    我使用的是idea,今天搭建一个项目时遇见了css和js路径错误,导致浏览器获取不到资源路径 这是我最开始写的路径 <link href="/main/loginMain.css&qu ...

  3. CORS跨域漏洞学习

    简介 网站如果存CORS跨域漏洞就会有用户敏感数据被窃取的风险. 跨域资源共享(CORS)是一种浏览器机制,可实现对位于给定域外部的资源的受控访问.它扩展了同源策略(SOP)并增加了灵活性.但是,如果 ...

  4. 手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc

    前言     一直以来对内部服务间使用RPC的方式调用都比较赞同,因为内部间没有这么多限制,最简单明了的方式就是最合适的方式.个人比较喜欢类似Dubbo的那种使用方式,把接口层单独出来,作为服务的契约 ...

  5. 【JAVA进阶架构师指南】之五:JVM性能调优

    前言   首先给大家说声对不起,最近属实太忙了,白天上班,晚上加班,回家还要收拾家里,基本每天做完所有事儿都是凌晨一两点了,没有精力再搞其他的了.   好了,进入正题,让我们来聊聊JVM篇最后一个章节 ...

  6. MSSQL2008下备份好的*.bak--->>>恢复到--->>>MSSQL2014(解决办法)

    MSSQL2008下备份好的*.bak--->>>恢复到--->>>MSSQL2014(解决办法) 在进行CTE训练时(同时也要理解下窗口函数的应用),发现不能继续 ...

  7. 授权函数-web_set_user

    为Web服务器指定登录字符串.当我们使用RNS服务器或者某些服务器的时候需要我们输入账号密码登录才能给进行访问,那么这个时候就需要用到该函数 int web_set_user(const char* ...

  8. 这一次搞懂Spring的XML解析原理

    前言 Spring已经是我们Java Web开发必不可少的一个框架,其大大简化了我们的开发,提高了开发者的效率.同时,其源码对于开发者来说也是宝藏,从中我们可以学习到非常优秀的设计思想以及优雅的命名规 ...

  9. 深入理解Java虚拟机学习笔记(三)-----类文件结构/虚拟机类加载机制

    第6章 类文件结构 1. 无关性 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(即扩展名为 .class 的文件) 是构成平台无关性的基石. 字节码(即扩展名为 .class 的文 ...

  10. fork,vfork和clone底层实现

    分类: LINUX2011-10-13 09:33 1116人阅读 评论(0) 收藏 举报 structdstsignalthreadnulldomain fork,vfork,clone都是linu ...