asp.net core 程序入口詳解及配置文件使用


 

 

asp.net core 程序入口詳解及配置文件使用

 

一、應用程序文件結構

如下圖所示,相比於Asp.Net項目,在新建的Asp.Net Core項目中,沒有了Global.asax以及Web.config這樣的文件,但多了幾個其他主要的文件,它們分別為:wwwroot、appsetting.jsonProgram.cs、Startup.cs

 

wwwroot:

首先,Razor Pages項目中多了一個wwwroot的文件夾,這個文件夾中,主要存放網站的靜態資源,如css,網站圖片資源文件,js文件,三方的js庫, 網站的圖標等。

appsetting.json

appsetting.json是應用程序配置文件,類似於ASP.NET MVC應用程序中的Web.config配置文件。

Program.cs

這是.NET Core的程序入口文件,包含Main函數。

Startup.cs

這是 .NET Core應用程序啟動配置項目文件

二、程序啟動

1.Program.cs

ASP.NET Core應用程序需要由Host(宿主)進行管理,宿主為其提供運行環境並負責啟動。所以Main函數主要是用來初始化宿主環境,而宿主環境的初始化需要借助WebHostBuilder。初始化完畢后,調用Run()方法來啟動應用程序。

1.WebHost.CreaateDefaultBuilder():創建WebHostBuilder。

2.UseStartup<Startup>():指定啟動類,用於依賴注入和中間件注冊。

3.Build():返回初始化完畢的IWebHost宿主。

4.Run():啟動WebHost。

 
Program.cs

CreateDefaultBuilder():

 
CreateDefaultBuilder()

從上圖中我們可以看出CreateDefaultBuilder()方法主要干了六件事:

UseKestrel:使用Kestrel作為Web server。

UseContentRoot:指定Web host使用的content root(內容根目錄),比如Views。默認為當前應用程序根目錄。

ConfigureAppConfiguration:設置當前應用程序配置。主要是讀取 appsettinggs.json 配置文件、開發環境中配置的UserSecrets、添加環境變量和命令行參數 。

ConfigureLogging:讀取配置文件中的Logging節點,配置日志系統。

UseIISIntegration:使用IISIntegration 中間件。

UseDefaultServiceProvider:設置默認的依賴注入容器。

創建完畢WebHostBuilder后,通過調用UseStartup()來指定啟動類,來為后續服務的注冊及中間件的注冊提供入口,IWebHostBuilder負責創建IWebHost,然后Run()方法啟動IWebHost。。

2. Startup.cs

Asp.Net Core 啟動類默認命名為Startup,它是在程序入口Main()函數中為了構造IWebHost時通過UseStartup<Startup>()指定的。

該類主要包括兩個方法:

2.1 ConfigureServices :

該方法一般用於配置服務將服務注冊到依賴注入容器中,在Configure方法之前被調用。通過調用IServiceCollection的擴展方法進行服務注冊。擴展方法的命名建議按照Add[MethodName]進行約定,比如Mvc相關服務的注冊services.AddMvc()。

除此之外,我們還可以在此方法中替換ASP.NET Core默認內置的依賴注入框架。比如我們使用Castle Windsor替換:

安裝Castle.Windsor.MsDependencyInjectionNuGet包;

修改方法返回值類型為IServiceProvider;

替換依賴容器:

 
Castle Windsor

2.2. Configure

該方法用於定義應用程序如何響應每個HTTP請求,以及配置HTTP流水線中的中間件。

 
Configure

該方法接受IApplicationBuilder作為參數,同時可以接受一些可選參數,如IHostingEnvironment和ILoggerFactory。而且,在ConfigureServices方法中注冊的其他服務,也可以直接在該方法中通過參數直接注入使用,比如:

 
testservice

因為該方法用於配置整個http請求管道,所以中間件的注冊要注意順序。同樣,在配置中間件時,我們同樣建議遵循Use[Middleware]的命名約定,比如啟用Mvc中間件app.UseMvc。

ASP.NET Core在調用之前已經默認注入了以下幾個可用服務:

IConfiguration:用於讀取應用程序配置。

IServiceCollection:可以理解為ASP.NET Core內置的依賴注入容器。

IApplicationBuilder:用於構建應用程序的請求管道。

IHostingEnvironment :提供了當前應用程序的運行的宿主環境配置信息。

除此之外,我們還可以使用已經注入的IServiceProvider、ILoggerFactory、ILogger、IApplicationLifetime等可用服務。這些預置服務可以注入到Startup類的構造函數或Configure方中。就像這樣:

 
注入

ConfigureServices只支持一個參數IServiceCollection,因為所有的依賴都可以通過IServiceCollection獲取,所以沒有必要通過方法再注入其他服務,可以直接通過以下方式解析依賴的服務:

 

 

2.3定義多個啟動類

我們看下Configure方法我們發現,通過IHostingEnvironment服務,我們可以獲取當前應用程序的運行環境。代碼中為開發環境啟用了異常詳情頁面、數據庫錯誤頁面和Brower Link(支持啟動多個web瀏覽器,並可同步刷新,一般用於跨瀏覽器測試),以方便我們開發調試。

ASP.NET Core默認內置了三種環境變量:Development、 Staging、Production。我們可以為每一種環境定義一個啟動類,命名為Startup[Environment]即可。在啟動時通過指定啟動類所在的程序集名稱即可根據launchSettings中的配置的ASPNETCORE_ENVIRONMENT自動加載對應的啟動類。

三、應用設置

1.啟動設置之launchSettings.json

 

launchSettings.json文件有兩個配置節點:“IIS Express”、“AspNetCoreStartDemo”,這兩個節點,分別對應Visual Stuido的開始調試按鈕的

 
launchSettings.json

 

 
節點含義

2.應用程序配置 appsettinggs.json

在應用啟動時的CreateDefaultBuilder()方法中,通過ConfigureAppConfiguration設置當前應用程序配置。

 
配置appsettings.json

在上面的代碼中,可以根據不同的運行環境讀取appsetting.json或appsetting.environment.json,需要注意的是,配置文件按照順序被依次讀取,后面的數據源會覆蓋前面的數據源。

如下所示是一個簡單的配置文件:

 
appsettings.json
 
CreateDefaultBuilder

在構建主機過程中使用appsettings.json中的配置。

3.讀取配置的方式

3.1 以鍵-值對的形式讀取配置

配置文件中的配置項,都是以鍵-值對的形式來體現的,所以最基礎的讀取方式就是直接讀取鍵值對。

 
appsettings.json
 
取值

3.2 使用GetValue<T>

這是一個擴展方法,使用它需要安裝Microsoft.Extensions.Configuration.Binder包。

 
取值


3.3.使用Options

這種方式需要安裝Microsoft.Extensions.Options.ConfigurationExtensions包。

調用AddOptions()添加使用Options需要的服務。

定義與配置對應的實體類

 
MyOptions.cs
 
綁定整個配置到POCO對象上
 
綁定特定節點的配置

 
綁定特定節點的配置
 
通過構造函數注入

3.4.使用Bind

和Get<T>類似,建議使用Get<T>。

 
Get<T>

 
綁定特定節點

3.5.文件變化自動重新加載配置

IOptionsSnapshot 支持配置文件變化自動重新加載配置。使用IOptionsSnapshot也很簡單,AddJsonFile有個重載,指定reloadOnChange:true即可。

 
reloadOnChange:true


4.命令行參數配置

命令行參數配置需要安裝Microsoft.Extensions.Configuration.CommandLine包。

調用AddCommandLine()擴展方法將命令行配置Provider添加到ConfigurationBuilder中

 

傳遞參數有兩種形式 :

 

 

如果為--AppId提供一個縮寫的參數-a,那么執行 dotnet run -a 12345 會報在switch mappings中沒有 -a 定義的錯誤。

幸好AddCommandLine還有一個重載,可以傳一個switch mapping。

 
這樣再運行上面的命令就不會報錯了 


5.環境變量配置

環境變量配置需要安裝 Microsoft.Extensions.Configuration.EnvironmentVariables 包。

調用AddEnvironmentVariables()擴展方法將環境變量配置Provider添加到ConfigurationBuilder中。

 
將環境變量配置Provider添加到ConfigurationBuilder

獲取所有的環境變量

 
獲取所有的環境變量

根據名稱獲取環境變量

 
根據名稱獲取環境變量

 

以上!


免責聲明!

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



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