只有累積,沒有奇蹟

2019年4月8日 星期一

[.NETCore] ASP.NET Core - ENVIRONMENT 使用環境變數

前言
假日上課時前同事詢問在 .NET 中要如何設定執行環境,在 ASP.NET Core 中可以自行定義環境變數值  ASPNETCORE_ENVIRONMENT  ,如果沒有特別設定該值則預設會是 Production,這一篇就分享在 .NET Core 中如何使用環境變數以及設定方式,若有問題或是錯誤的地方歡迎各位高手給予指導

ENVIRONMENT 
首先,如果有開發 .NET Core 開發者相信大家一定看過下面這段代碼,在 .NET Core 新增 Web Application 後開啟  startup.cs  內的 Configure 可以看到下列代碼
  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. app.UseHsts();
  10. }
  11.  
  12. // to do something
  13. }
分享一下自己對於這段 Code 的理解,Configure 方法注入  IHostingEnvironment  至啟動邏輯中,接著使用  env.IsDevelopment  方法判斷目前環境是否為開發環境,如果是的話就會進入到 UseDeveloperExceptionPage 也就是開發環境的錯誤訊息頁面,在追根究柢往下看 env.IsDevelopment 做了什麼事,按下 F12 去查看代碼背後是使用 IHostingEnvironment 的  IsEnvironment  方法,代碼如下
  1. /// <summary>
  2. /// Checks if the current hosting environment name is <see cref="F:Microsoft.AspNetCore.Hosting.EnvironmentName.Development" />.
  3. /// </summary>
  4. /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param>
  5. /// <returns>True if the environment name is <see cref="F:Microsoft.AspNetCore.Hosting.EnvironmentName.Development" />, otherwise false.</returns>
  6. public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment)
  7. {
  8. if (hostingEnvironment == null)
  9. throw new ArgumentNullException(nameof (hostingEnvironment));
  10. return hostingEnvironment.IsEnvironment(EnvironmentName.Development);
  11. }
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
  1. {
  2. "iisSettings": {
  3. "windowsAuthentication": false,
  4. "anonymousAuthentication": true,
  5. "iisExpress": {
  6. "applicationUrl": "http://localhost:5627",
  7. "sslPort": 44308
  8. }
  9. },
  10. "$schema": "http://json.schemastore.org/launchsettings.json",
  11. "profiles": {
  12. "IIS Express": {
  13. "commandName": "IISExpress",
  14. "launchBrowser": true,
  15. "launchUrl": "api/values",
  16. "environmentVariables": {
  17. "ASPNETCORE_ENVIRONMENT": "Staging"
  18. }
  19. },
  20. "EFCoreApplication": {
  21. "commandName": "Project",
  22. "launchBrowser": true,
  23. "launchUrl": "api/values",
  24. "environmentVariables": {
  25. "ASPNETCORE_ENVIRONMENT": "Development"
  26. },
  27. "applicationUrl": "https://localhost:5001;http://localhost:5000"
  28. }
  29. }
  30. }

設定方式 
以下說明修改專案的 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 設定系統變數
語法如下
  1. $Env:ASPNETCORE_ENVIRONMENT = "Development"

Web.Config
透過 Web.Config 設定
  1. <PropertyGroup>
  2. <EnvironmentName>Development</EnvironmentName>
  3. </PropertyGroup>

macOS 與 Linux
.NET Core 跨平台是眾所皆知的,因此在非 Windows 下當然也可以設定環境變數值,但由於手邊沒有 macOS (家裡窮) 以及 Linux 環境,因此如果有設定上的需求可以參考 MSDN 說明,傳送門

感想
在設定環境變數來說,整體上操作與設定都不難,算是蠻容易上手的,另外在 Configure 和 ConfigureServices 也支援 Configure<EnvironmentName> 和 Configure<EnvironmentName>Services 也支援指定環境方法來做特定版本的設定方式,這方式是看了 MSDN 官方說明才知道有這方式,如果有需要要也可以參考看看,Happy Coding :)

參考
在 ASP.NET Core 中使用多個環境

Related Posts:

  • [NETCore] 在 ASP.NET Core Web API 中使用 Serilog 前言 近期專案都在嘗試 Serilog,對於使用上有點小小心得,因此整理這篇文章分享 Serilog 在 ASP.NET Core API 上的使用與設定,也接續之前 Serilog 的系列介紹文 : 傳送門 的實際應用心得,希望可以幫到有需要的朋友,若有問題或是錯誤的地方歡迎提出來一起討論或是給予指導。 ASP.NET Core logging 首先先建立新的 ASP.NET Core Web Applicat… Read More
  • [NETCore] 結構化日誌 Serilog 初體驗前言 在 .NET 使用日誌框架第一時間會想到 NLog 或是 Log4Net 兩種 Log 常使用的 Library,Serilog 是這幾年快速崛起的 Log 框架之一,Serilog 是以 Structured logging 為基礎進行設計,透過 logging API 可以輕鬆的記錄應用程式中對象屬性,方便快速進行 logging 內容進行查詢與分析,並將其紀錄內容透過 json (可指定) 的方式輸出,這篇就介紹 … Read More
  • [NETCore] 結構化日誌 Serilog - Events Types 和 Enrichment 前言 前兩篇分別介紹了關於 Serilog 的基礎應用與設定,這篇就來針對事件類型 Event Type 與 介紹幾個常用的 Enricher,若有問題或是錯誤的地方歡迎提出來一起討論。 Event Type 結構化日誌的好處是可以清楚的分辨"每一次"紀錄的事件,舉例來說下列簡單的代碼是透過 Serilog 寫入log 到 Console 與 File 檔案,紀錄內容是 3 筆資料 Log.Logger = new LoggerCo… Read More
  • [NETCore] ASP.NET Core 啟動異常 - HTTP Error 500.30 - ANCM In-Process Start Failure 問題  在開發專案時跳出異常訊息,錯誤訊息為  HTTP Error 500.30 - ANCM In-Process Start Failure ,這篇就針對此案例作簡單紀錄與分享,若是有不清楚或是錯誤的地方歡迎討論予糾正。 解決方法  廢話不多說,先看案發現場的錯誤畫面 執行異常的程式代碼,看起來很單純的代碼 public static void Main(s… Read More
  • [NETCore] Serilog 好幫手 - Serilog Analyzer前言 前面透過幾篇文章介紹了關於 Serilog 在 ASP.NET Core 中的應用,分別是 結構化日誌 Serilog 初體驗 結構化日誌 Serilog - 配置設定 結構化日誌 Serilog - Events Types 和 Enrichment 三篇文章從 Serilog 基本使用以及設定都做簡單的介紹,今天要分享的是 Serilog Analyzer 擴充套件,它是基於 Roslyn 針對代碼進行分析,可以… Read More

0 意見:

張貼留言

Copyright © 2025 m@rcus 學習筆記 | Powered by Blogger

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com