.NET 網站專案建立時會附帶兩個 appsettings 檔:appsettings.json 及 appsettings.Development.json。

ASP.NET Core 執行時會由 appsettings.json 讀取設定,開發測試階段還會載入 appsettings.Development.json,正式部署時則是載入 appsettings.Production.json。如此,我們可以讓同一設定值具有多個版本,所有環境都相同的通用設定放在 appsettings.json,開發測試專用設定放在 appsettings.Development.json、正式環境用的放在 appsettings.Production.json,甚至再區分 Staging、Beta、Preview 等自訂環境。

ASP.NET Core 預設有三種環境模式:Development、Staging 及 Production,並可依不同環境設定不同行為(例如:在 Development 環境才顯示詳細錯誤訊息),透過 ASPNETCORE_ENVIRONMENT 環境變數,還可以再增加自訂的環境名稱。而依據執行環境載入不同 appsettings.json 設定,也是 ASP.NET Core 環境的主要應用情境。參考

以下來實地演練一下。

先開一個 ASP.NET Core Minimal API 網站專案,除了原有 appsettings.json 及 appsettings.Development.json,我再多建一個 appsettings.Production.json。

三個 JSON 檔內容如下。appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "MySetting": "From appsettings.json"
}

appsettings.Development.json:

{
  "MySetting": "From appsettings.Development.json"
}

appsettings.Production.json:

{
  "MySetting": "From appsettings.Production.json"
}

Program.cs 稍做修改,MapGet("/") 時顯示環境變數 ASPNETCORE_ENVIRONMENT 及 IConfiguration "MySetting" 內容:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => @$"
Environment: {Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}
MySetting: {app.Configuration["MySetting"]}");

app.Run();

使用 dotnet run 執行,連上網站看到的 ASPNETCORE_ENVIRONMENT 變數為 Development、MySetting 來自 appsettings.Development.json:

這是因為在 Properties\launchSettings.json 中宣告了 ASPNETCORE_ENVIRONMENT = Development:

接著我們 dotnet publish -c Release 發佈網站並掛載到 IIS:

實測可發現,如文件所說,當未設定 DOTNET_ENVIRONMENT 或 ASPNETCORE_ENVIRONMENT,預設為 Production 環境,因此 MySetting 來自 appsettings.Production.json:

若要切換成其他環境(這裡以 Development 為例),可加上 EnvironmentName 參數以 dotnet publish -c Release -p:EnvironmentName=Development 發佈檔案,差別會在輸出 web.config 時會加上含 system.webServer/aspNetCore/environmentVariables/environmentVairable name="ASPNETCORE_ENVIRONMENT":

如此,ASP.NET Core 網站將切換成 Development 並改讀取 appsettings.Development.json:

若是用 Visual Studio 的 Publish 功能發佈,可在 FolderProfile.pubxml 加入<EnvironmentName>Development</EnvironmentName>達到相同效果。

演練完畢。

Example of how to read different appsetting value by ASP.NET Core environment.


Comments

# by 小黑

nice

# by ALEX

linux 的話 也可以在 xxxx.service 設定(參考 https://blog.darkthread.net/blog/aspnetcore-with-nginx/ 的第 9 點)

Post a comment