假日上課時前同事詢問在 .NET 中要如何設定執行環境,在 ASP.NET Core 中可以自行定義環境變數值 ASPNETCORE_ENVIRONMENT ,如果沒有特別設定該值則預設會是 Production,這一篇就分享在 .NET Core 中如何使用環境變數以及設定方式,若有問題或是錯誤的地方歡迎各位高手給予指導。
ENVIRONMENT
首先,如果有開發 .NET Core 開發者相信大家一定看過下面這段代碼,在 .NET Core 新增 Web Application 後開啟 startup.cs 內的 Configure 可以看到下列代碼
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } // to do something }
分享一下自己對於這段 Code 的理解,Configure 方法注入 IHostingEnvironment 至啟動邏輯中,接著使用 env.IsDevelopment 方法判斷目前環境是否為開發環境,如果是的話就會進入到 UseDeveloperExceptionPage 也就是開發環境的錯誤訊息頁面,在追根究柢往下看 env.IsDevelopment 做了什麼事,按下 F12 去查看代碼背後是使用 IHostingEnvironment 的 IsEnvironment 方法,代碼如下
環境設定 /// <summary> /// Checks if the current hosting environment name is <see cref="F:Microsoft.AspNetCore.Hosting.EnvironmentName.Development" />. /// </summary> /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param> /// <returns>True if the environment name is <see cref="F:Microsoft.AspNetCore.Hosting.EnvironmentName.Development" />, otherwise false.</returns> public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment) { if (hostingEnvironment == null) throw new ArgumentNullException(nameof (hostingEnvironment)); return hostingEnvironment.IsEnvironment(EnvironmentName.Development); }IsEnvironment 方法是去取得目前的環境變數 hostingEnvironment.EnvironmentName 看是不是 development,其中 EnvironmentName 就是今天的重點,在 .NET Core 中可以透過設定 ASPNETCORE_ENVIRONMENT 定義目前應用程式運行的環境,預設內建 Development、Staging 以及 Production 三種值,環境變數是應用程式用來取得當前正在運行的環境,並依照環境變數值做適當的配置,舉例來說如果是 Production 環境的話就啟用 cache、關閉錯誤訊息畫面確保資訊不外洩、產生相對應的 Log 與監控...等行為,以上行為在 Development 與 Staging 都不啟用,都可以依據需求來自行定義執行邏輯。
如果需要在本機環境模擬不同的環境,在 .NET Core 中可以透過設定 properties\launchSettings.json 檔案定義目前應用程式運行的環境,在.NET 應用程式執行啟動時會先讀取 launchSettings.json ,檔案中的 environmentVariables 會覆寫系統環境的設定值。
其中在專案按下 F5 執行應用程式時,可以設定執行方式是 IIS Express 或是 Project 執行,其中就可以設定 ASPNETCORE_ENVIRONMENT 變數,其各自可以定義不同的環境變數值,舉例來說我們開啟 launchSettings.json 檔案,就可以看到 commandName 屬性對應到上圖的下拉選單值 IIS Express 與 ProjectName ,IIS Express 環境變數為 Staging,如果用 Project 啟動的話環境變數則是 Development
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:5627", "sslPort": 44308 } }, "$schema": "http://json.schemastore.org/launchsettings.json", "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "launchUrl": "api/values", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Staging" } }, "EFCoreApplication": { "commandName": "Project", "launchBrowser": true, "launchUrl": "api/values", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "https://localhost:5001;http://localhost:5000" } } }
設定方式
以下說明修改專案的 launchSetting.json 與設定系統變數 ASPNETCORE_ENVIRONMENT 的設定方式
Visual Studo IDE 設定 launchSettings.json
在 Visual Studio 則可以提供 GUI 介面可以進行環境變數值設定,設定方式為在專案按右鍵 > property > debug,看到中間區塊可以修改變數值得內容
Windows 設定系統變數
Step 1 : 開啟控制台 > 系統及安全性 > 系統
Step 2 : 進階系統設定 > 進階 > 環境變數
Step 3 : 新增系統變數 > 變數名稱 ASPNETCORE_ENVIRONMENT,變數值 Development
使用 powershell 設定系統變數
語法如下
$Env:ASPNETCORE_ENVIRONMENT = "Development"
Web.Config
透過 Web.Config 設定
<PropertyGroup> <EnvironmentName>Development</EnvironmentName> </PropertyGroup>
macOS 與 Linux
.NET Core 跨平台是眾所皆知的,因此在非 Windows 下當然也可以設定環境變數值,但由於手邊沒有 macOS (家裡窮) 以及 Linux 環境,因此如果有設定上的需求可以參考 MSDN 說明,傳送門
在設定環境變數來說,整體上操作與設定都不難,算是蠻容易上手的,另外在 Configure 和 ConfigureServices 也支援 Configure<EnvironmentName> 和 Configure<EnvironmentName>Services 也支援指定環境方法來做特定版本的設定方式,這方式是看了 MSDN 官方說明才知道有這方式,如果有需要要也可以參考看看,Happy Coding :)
參考
在 ASP.NET Core 中使用多個環境
0 意見:
張貼留言