一、一切从头开始

简述:知道事情的真相就应该从头 开始,下面我们代码先行

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}

可见,关键是我们需要研究CreateHostBuilder整个方法内部做了什么,不要简单地看这个方法,真实情况涉及很深.本文简化很多问题来说明

二、先让我们熟悉几个数据结构

2.1 IHostBuilder (暂时写这一个,后续再增加)

public interface IHostBuilder
{
    IDictionary<object, object> Properties
    {
        get;
    }
  //宿主程序的配置
    IHostBuilder ConfigureHostConfiguration(Action<IConfigurationBuilder> configureDelegate);
  //应用程序的配置
    IHostBuilder ConfigureAppConfiguration(Action<HostBuilderContext, IConfigurationBuilder> configureDelegate);
  //添加service到容器
    IHostBuilder ConfigureServices(Action<HostBuilderContext, IServiceCollection> configureDelegate);
    IHostBuilder UseServiceProviderFactory<TContainerBuilder>(IServiceProviderFactory<TContainerBuilder> factory);
  //覆盖用于创建ServiceProvider的工厂。
    IHostBuilder UseServiceProviderFactory<TContainerBuilder>(Func<HostBuilderContext, IServiceProviderFactory<TContainerBuilder>> factory);
/  /配置依赖注入的容器
    IHostBuilder ConfigureContainer<TContainerBuilder>(Action<HostBuilderContext, TContainerBuilder> configureDelegate);     IHost Build();
}

得出简要的分析和猜测:CreateHostBuilder中设置Asp.net core中所需诸多原始素材:配置信息(包括环境等),IOC所需的种种素材,创建web程序所需的宿主WebHost然后将上面的素材同时传给WebHost.......

三、CreateDefaultBuilder方法内部做了什么

public static IHostBuilder CreateDefaultBuilder(string[] args)
{
HostBuilder hostBuilder = new HostBuilder();
hostBuilder.UseContentRoot(Directory.GetCurrentDirectory());
     //设置Host的配置信息
hostBuilder.ConfigureHostConfiguration((Action<IConfigurationBuilder>)delegate(IConfigurationBuilder config)
{
config.AddEnvironmentVariables("DOTNET_");
if (args != null)
{
config.AddCommandLine(args);
}
});
     //设置应用程序的配置信息
hostBuilder.ConfigureAppConfiguration((Action<HostBuilderContext, IConfigurationBuilder>)delegate(HostBuilderContext hostingContext, IConfigurationBuilder config)
{
IHostEnvironment hostingEnvironment = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile("appsettings." + hostingEnvironment.EnvironmentName + ".json", optional: true, reloadOnChange: true);
if (hostingEnvironment.IsDevelopment() && !string.IsNullOrEmpty(hostingEnvironment.ApplicationName))
{
Assembly assembly = Assembly.Load(new AssemblyName(hostingEnvironment.ApplicationName));
if (assembly != null)
{
config.AddUserSecrets(assembly, optional: true);
}
}
config.AddEnvironmentVariables();
if (args != null)
{
config.AddCommandLine(args);
}
})//设置日志的相关配置
.ConfigureLogging((Action<HostBuilderContext, ILoggingBuilder>)delegate(HostBuilderContext hostingContext, ILoggingBuilder logging)
{
bool num = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
if (num)
{
logging.AddFilter<EventLogLoggerProvider>((LogLevel level) => level >= LogLevel.Warning);
}
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
if (num)
{
logging.AddEventLog();
}
}).UseDefaultServiceProvider((Action<HostBuilderContext, ServiceProviderOptions>)delegate(HostBuilderContext context, ServiceProviderOptions options)
{
bool validateOnBuild = options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
options.ValidateOnBuild = validateOnBuild;
});
return hostBuilder;
}

我们先总结一些知识点和注意事项

1.程序的默认的根目录采用了Directory.GetCurrentDirectory()也就是Environment.CurrentDirectory,那么这意味着我们在用其它程序启动应用时需要手动指定当前工作目录,避免发生变化.

2.asp.net core中两个路径的区别

ContentRoot:  C:\MyApp
WebRoot: C:\MyApp\wwwroot

3.asp.net core中配置文件的优先级问题

命令行>环境变量>自我订制的配置(AddUserSecrets)>和当前环境相匹配的appsettings.json中的配置>大于appsettings.json中的配置

  关于AddUserSecrets是什么这里简单一言以蔽之:每个开发人员有自己特性的配置数据,这些配置信息仅仅属于个人,不能提交给团队成员,

  但是又不想不团队共有的配置所影响. 剩下的自行去了解,关键是上面的优先级

  和当前环境相匹配的appsettings.json如appsettings.Development.json

4.系统会默认添加日志行为如下

  a.windows会添加事件(level >= LogLevel.Warning)

  b.默认会将采用appsettings.json中Logging节点下的配置情况

  c.日志信息默认会显示咋控制台和调试中

四、 Startup 类

主要作用:配置服务和应用的请求管道。ASP.NET Core 按照约定命名为 Startup作为 Startup 类:

1.可选择性地包括 ConfigureServices 方法以配置应用的服务 。 服务是一个提供应用功能的可重用组件。

  在 ConfigureServices 中注册服务,并通过依赖关系注入 (DI) 或 ApplicationServices 在整个应用中使用服务 。

2.包括 Configure 方法以创建应用的请求处理管道。

在启动时,ASP.NET Core会调用 ConfigureServices 和 Configure:

    public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// 该方法会被运行时自动调用,通过此方法可将service添加到容器中.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
}
// 该方法会被运行时自动调用. 使用此方法配置 HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}

Startup总结:

  从第一部分我们可以看到在程序启动时通过webBuilder.UseStartup<Startup>()将Startup指定给Host,

注意:Host能够提供 Startup 类构造函数可用的某些服务。 应用自身可通过 ConfigureServices方法 添加你需要的其他服务。

主机和应用提供的这些服务都可以在 Configure 和整个应用中使用。

使用泛型Host (IHostBuilder) 时,只能将以下服务类型注入 Startup 构造函数:
  IWebHostEnvironment
  IHostEnvironment
  IConfiguration

  未完待续,不足之处欢迎请指正.

《ASP.NET Core 高性能系列》ASP.NET Core的启动过程(1)的更多相关文章

  1. 《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文!

    写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费, ...

  2. ABP(现代ASP.NET样板开发框架)系列之5、ABP启动配置

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之5.ABP启动配置 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...

  3. 《ASP.NET Core 高性能系列》关于.NET Core的部署方式

    概述,.NET Core应用程序可以创建三种类型的部署:FDD SCD FDE 框架依赖的部署(FDD).顾名思义,框架依赖的部署(FDD)依赖于目标系统上是否存在.NET Core版本.由于.NET ...

  4. 【.Net Core 学习系列】-- EF Core 实践(Code First)

    一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二解决方案: 新建项目: File --> New --> Project -->   ...

  5. 【.Net Core 学习系列】-- EF Core实践(DB First)

    一.开发环境: VS2015, .Net Core 1.0.0-preview2-003156 二.准备数据: CREATE DATABASE [Blogging]; GO USE [Blogging ...

  6. 《ASP.NET Core 高性能系列》关于.NET Core的配置信息的若干事项

    1.配置文件的相关闲话 Core自身对于配置文件不是必须品,但由上文分析可知ASP.NET Core默认采用appsettings.json作为配置文件,关于配置信息的优先等级 命令行>环境变量 ...

  7. 《ASP.NET Core 高性能系列》静态文件中间件

    一.概述 静态文件(如 HTML.CSS.图片和 JavaScript等文件)是 Web程序直接提供给客户端的直接加载的文件. 较比于程序动态交互的代码而言,其实原理都一样(走Http协议), ASP ...

  8. 《ASP.NET Core 高性能系列》环境(EnvironmentName)的设置

    一.概述 程序启动时Host捕获到环境相关数据,然后交由IEnvironment(传说要作废,但是觉得这个有设计点问题,因为.NET Core 非Web怎么处理?),然后交由IWebHostEnvir ...

  9. 《ASP.NET Core 高性能系列》关于性能的闲聊

    一.通常的性能问题类型 让我们一起看看那些公共的性能问题,看看他们是或者不是.我们将了解到为什么我们常常在开发期间会错过这些问题.我们也会看看当我们考虑性能时语言的选择.延迟.带宽.计算等因素. 二. ...

随机推荐

  1. MySQL性能优化:MySQL中的隐式转换造成的索引失效

    数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很 ...

  2. 使用spring boot中的JPA操作数据库

    前言 Spring boot中的JPA 使用的同学都会感觉到他的强大,简直就是神器一般,通俗的说,根本不需要你写sql,这就帮你节省了很多时间,那么下面我们来一起来体验下这款神器吧. 一.在pom中添 ...

  3. 【python测试开发栈】帮你总结python random模块高频使用方法

    随机数据在平时写python脚本时会经常被用到,比如随机生成0和1来控制逻辑.或者从列表中随机选择一个元素(其实抽奖程序也类似,就是从公司所有人中随机选择中奖用户)等等.这篇文章,就帮大家整理在pyt ...

  4. 【题解】LOJ2759. 「JOI 2014 Final」飞天鼠(最短路)

    [题解]LOJ2759. 「JOI 2014 Final」飞天鼠(最短路) 考虑最终答案的构成,一定是由很多飞行+一些上升+一些下降构成. 由于在任何一个点上升或者下降代价是一样的,所以: 对于上升操 ...

  5. 「BZOJ1385」「Baltic2000」Division expression 解题报告

    Division expression Description 除法表达式有如下的形式: \(X_1/X_2/X_3.../X_k\) 其中Xi是正整数且\(X_i \le 1000000000(1 ...

  6. Q&A系列一:DataPipeline常见问题回答

    不知不觉中,大家已经陪伴DataPipeline走过了3年时间.在这期间,得益于客户们的积极反馈和沟通,我们总结了一些日常工作中比较常见的问题,并基于这些问题进行了总结. 为避免突兀,我们会先从比较基 ...

  7. JVM之GC(二)

    昨天总结了GC之前要做的事情,今天介绍一下主流的GC算法. 先介绍一下几个名词: Stop The World(STW):JVM进行GC的时候总不能一边清理垃圾一边制造垃圾把,那么垃圾鉴定的准确性根本 ...

  8. Java中枚举类型与for、switch语句

    1.枚举类型的声明 格式为: enum 枚举类型名{ 常量1,常量2,常量3 } 如: enum Number{ one,two,three,four,five    //常量} 注意:enum内装的 ...

  9. 【转】在Ubuntu下建立Eclipse的Android开发环境

    本文将介绍如何建立Ubuntu下基于Eclipse的Android开发环境的方法. 大部分的Android开发者都是使用Eclipse来开发Android,本文将向各位介绍一下建立Ubuntu下基于E ...

  10. vue报错 [Intervention] Ignored attempt to cancel a touchmove event with cancelable

    在vue开发中使用vue-awesome-swiper制作轮播图,手动拖动时会报错,解决方案: 需要滑动的标签 { touch-action: none; } -------------------- ...