zoukankan      html  css  js  c++  java
  • Program.cs 和 Startup.cs 各自作用及启动顺序 -- ASP.NET Core 3 随笔【2】

    我们在VS2019新建一个空的API项目,会发现在ASP.NET Core环境下,项目变的更加简单明了,而且比之前多了几个不一样的东西,如下图:

    Program.cs 这个以前我们只有在控制台程序才会发现的东西,为什么会出现在这里?我分明创建的是一个API的Web程序啊。

    这里就涉及到一个很重要的东西:每一个ASP.NET Core 应用程序,从本质上来说,都是一个独立的控制台应用,并不需要依托IIS来运行,这也是它能实现跨平台的一个基础。

    一、Program.cs  -- 创建并运行WebHost实例,调用Startup类

     1     public class Program
     2     {
     3         public static void Main(string[] args)
     4         {
     5             CreateHostBuilder(args).Build().Run();
     6         }
     7 
     8         public static IHostBuilder CreateHostBuilder(string[] args) =>
     9             Host.CreateDefaultBuilder(args)
    10                 .ConfigureWebHostDefaults(webBuilder =>
    11                 {
    12                     webBuilder.UseStartup<Startup>();
    13                 });
    14     }

    在Main方法里面

    CreateHostBuilder(args)  -- 创建一个 IHostBuilder 对象

    .CreateDefaultBuilder

    这个里面做的事情包括

    • 将内容根目录设置为由 GetCurrentDirectory 返回的路径。
    • 通过以下项加载主机配置:
      • 前缀为 DOTNET_ 的环境变量。
      • 命令行参数。
    • 通过以下对象加载应用配置:
      • appsettings.json 。
      • appsettings.{Environment}.json 。
      • 密钥管理器 当应用在 Development 环境中运行时。
      • 环境变量。
      • 命令行参数。
    • 添加以下日志记录提供程序:
      • 控制台
      • 调试
      • EventSource
      • EventLog(仅当在 Windows 上运行时)
    • 当环境为“开发”时,启用范围验证和依赖关系验证。

    .ConfigureWebHostDefaults

    这个里面做的事情包括:

    • 从前缀为 ASPNETCORE_ 的环境变量加载主机配置。
    • 使用应用的托管配置提供程序将 Kestrel 服务器设置为 web 服务器并对其进行配置。 
    • 添加主机筛选中间件。
    • 如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 等于 true,则添加转接头中间件。
    • 支持 IIS 集成。 

    Build() :创建IHost

    Run():启动运行IHost

    二、Startup.cs 

    Startup 类配置服务和应用的请求管道。

     1     public class Startup
     2     {
     3         public Startup(IConfiguration configuration)
     4         {
     5             Configuration = configuration;
     6         }
     7 
     8         public IConfiguration Configuration { get; }
     9 
    10         // This method gets called by the runtime. Use this method to add services to the container.
    11         public void ConfigureServices(IServiceCollection services)
    12         {
    13             services.AddControllers();
    14         }
    15 
    16         // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    17         public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    18         {
    19             if (env.IsDevelopment())
    20             {
    21                 app.UseDeveloperExceptionPage();
    22             }
    23 
    24             app.UseHttpsRedirection();
    25 
    26             app.UseRouting();
    27 
    28             app.UseAuthorization();
    29 
    30             app.UseEndpoints(endpoints =>
    31             {
    32                 endpoints.MapControllers();
    33             });
    34         }
    35     }

    ConfigureServices :  将服务注入到IServiceCollection服务容器中

    • 在 Configure 方法配置应用服务之前,由主机调用。
    • 其中按常规设置配置选项。

    Configure :指定应用响应 HTTP 请求的方式

    Configure 方法用于指定应用响应 HTTP 请求的方式。 可通过将中间件组件添加到 IApplicationBuilder 实例来配置请求管道。 IApplicationBuilder 方法可使用 Configure,但未在服务容器中注册。 托管创建 IApplicationBuilder 并将其直接传递到 Configure

    ASP.NET Core 模板配置的管道支持:

    • 开发人员异常页
    • 异常处理程序
    • HTTP 严格传输安全性 (HSTS)
    • HTTPS 重定向
    • 静态文件
    • ASP.NET Core MVC 和 Razor Pages

    三、启动顺序

    Program.cs 里面的Main方法最先启动,然后会调用Startup类,Startup类里面先调用 ConfigureServices 方法 ,再调用 Configure  方法。

  • 相关阅读:
    Ubuntu 14.04 apt-get update失效解决(转)
    linux内核动态调试技术
    Ubuntu18.04开机挂载硬盘
    valgrind memcheck使用方法及效果(转)
    网络测试工具netperf(转)
    开发pc端项目可支持多个窗口登陆
    sql常用语句
    包装类和基础类的区别
    @param
    前台后台的顺序
  • 原文地址:https://www.cnblogs.com/hzsasheng/p/12795447.html
Copyright © 2011-2022 走看看