asp.net core 程序入口詳解及配置文件使用
一、應用程序文件結構
如下圖所示,相比於Asp.Net項目,在新建的Asp.Net Core項目中,沒有了Global.asax以及Web.config這樣的文件,但多了幾個其他主要的文件,它們分別為:wwwroot、appsetting.json、Program.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。
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;
替換依賴容器:
2.2. Configure
該方法用於定義應用程序如何響應每個HTTP請求,以及配置HTTP流水線中的中間件。
該方法接受IApplicationBuilder作為參數,同時可以接受一些可選參數,如IHostingEnvironment和ILoggerFactory。而且,在ConfigureServices方法中注冊的其他服務,也可以直接在該方法中通過參數直接注入使用,比如:
因為該方法用於配置整個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的開始調試按鈕的
2.應用程序配置 appsettinggs.json
在應用啟動時的CreateDefaultBuilder()方法中,通過ConfigureAppConfiguration設置當前應用程序配置。
在上面的代碼中,可以根據不同的運行環境讀取appsetting.json或appsetting.environment.json,需要注意的是,配置文件按照順序被依次讀取,后面的數據源會覆蓋前面的數據源。
如下所示是一個簡單的配置文件:
在構建主機過程中使用appsettings.json中的配置。
3.讀取配置的方式
3.1 以鍵-值對的形式讀取配置
配置文件中的配置項,都是以鍵-值對的形式來體現的,所以最基礎的讀取方式就是直接讀取鍵值對。
3.2 使用GetValue<T>
這是一個擴展方法,使用它需要安裝Microsoft.Extensions.Configuration.Binder包。
3.3.使用Options
這種方式需要安裝Microsoft.Extensions.Options.ConfigurationExtensions包。
調用AddOptions()添加使用Options需要的服務。
定義與配置對應的實體類
或
3.4.使用Bind
和Get<T>類似,建議使用Get<T>。
或
3.5.文件變化自動重新加載配置
IOptionsSnapshot 支持配置文件變化自動重新加載配置。使用IOptionsSnapshot也很簡單,AddJsonFile有個重載,指定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中。
獲取所有的環境變量
根據名稱獲取環境變量
以上!
