我們在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 方法。