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  方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM