《ASP.NET Core 高性能系列》ASP.NET Core的启动过程(1)

一、一切从头开始

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

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\wwwroot
WebRoot:      C:\MyApp\wwwroot\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

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

原文地址:https://www.cnblogs.com/humble/p/12260176.html

时间: 2024-09-27 22:25:00

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

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

原文:<ASP.NET Core 高性能系列>致敬伟大的.NET斗士甲骨文! 写在开始 三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击, 现在可以致敬伟大的.NET斗士甲骨文了 (JDK8以上都需要收费,Android弃用java作为第一语言,别高兴:OpenJDK是甲骨文的). <ASP.NET Core 高性能系列>是一套如何编写高性能Web应用技术系列文章, 我们将从.NET 2开始全面升入.其中我们会

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

原文:<ASP.NET Core 高性能系列>静态文件中间件 一.概述 静态文件(如 HTML.CSS.图片和 JavaScript等文件)是 Web程序直接提供给客户端的直接加载的文件. 较比于程序动态交互的代码而言,其实原理都一样(走Http协议), ASP.NET Core中需要进行一些配置才能提供这些文件. 二.wwwroot 静态文件存储在项目的 Web 程序的 {ContentRoot}/wwwroot目录下,但可通过 UseWebRoot 方法更改路径 . Web 应用程序项目的

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

原文:<ASP.NET Core 高性能系列>环境(EnvironmentName)的设置 一.概述 程序启动时Host捕获到环境相关数据,然后交由IEnvironment(传说要作废,但是觉得这个设计依旧前后矛盾,因为没有考虑好非Web 和Web区分),然后交由IWebHostEnvironment,对于ASP.NET Core环境而言,同样会存储在 IWebHostEnvironment.EnvironmentName,ASP.NET Core框架自身提供Development.Stagi

基于DDD的现代ASP.NET开发框架--ABP系列之5、ABP启动配置

点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之5.ABP启动配置 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 本文由 东莞-天道 提供翻译 译者注:在看这一节的内容之前,建议大家先下载module-zero这

hbase源码系列(六)HMaster启动过程

这一章是server端开始的第一章,有兴趣的朋友先去看一下hbase的架构图,我专门从网上弄下来的. 按照HMaster的run方法的注释,我们可以了解到它的启动过程会去做以下的动作. * <li>阻塞直到变成ActiveMaster * <li>结束初始化操作 * <li>循环 * <li>停止服务并执行清理操作* </ol> HMaster是没有单点问题是,因为它可以同时启动多个HMaster,然后通过zk的选举算法选出一个HMaster来.

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

概述,.NET Core应用程序可以创建三种类型的部署:FDD SCD FDE 框架依赖的部署(FDD).顾名思义,框架依赖的部署(FDD)依赖于目标系统上是否存在.NET Core版本.由于.NET Core已经存在,因此您的应用程序在不同的.NET Core版本中进行移植.您的应用程序仅包含其自己的代码以及.NET Core库之外的任何第三方依赖项.FDD包含.dll文件,可以通过使用dotnet命令行启动这些文件. 例如,dotnet app.dll运行名为的应用程序app. 自包含的部署

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

1.配置文件的相关闲话 Core自身对于配置文件不是必须品,但由上文分析可知ASP.NET Core默认采用appsettings.json作为配置文件,关于配置信息的优先等级 命令行>环境变量>自我订制的配置(AddUserSecrets)>和当前环境相匹配的appsettings.json中的配置>大于appsettings.json中的配置 关于AddUserSecrets是什么这里简单一言以蔽之:每个开发人员有自己特性的配置数据,这些配置信息仅仅属于个人,不能提交给团队成员

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

一.通常的性能问题类型 让我们一起看看那些公共的性能问题,看看他们是或者不是.我们将了解到为什么我们常常在开发期间会错过这些问题.我们也会看看当我们考虑性能时语言的选择.延迟.带宽.计算等因素. 二.语言的考虑 人们经常关注所使用的编程语言的速度.然而,这经常没有抓住要点.这是一个非常简单的观点,掩盖了技术选择的细微差别,用任何语言编写速度慢的软件都很容易.由于当今计算机的处理速度非常强大,所以解释性能相对较慢的语言通常足够快,而开发中性能的提高是值得的.要理解所涉及的论点和权衡是很重要的,即使

《ASP.NET Core 高性能系列》Span&lt;T&gt;和Memory&lt;T&gt;

一.Span<T>概述 原文:Provides a type- and memory-safe representation of a contiguous region of arbitrary memory. 中文的翻译不准确,这里给出比较厚道的翻译:提供类型T安全.连续的内存区域的表达方式. (图1:Span<T>定义,不是全图) 这里出现高阶语法 readonly ref struct,下面是msdn给的语言规范(或者其核心意义),估计大家会看晕, Span<T>