只有累積,沒有奇蹟

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 可以看到下列代碼
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 意見:

張貼留言

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

Design by Anders Noren | Blogger Theme by NewBloggerThemes.com