3

ASP.NET Core 依環境載入不同 appsetting.json 設定

 1 year ago
source link: https://blog.darkthread.net/blog/appsetting-by-environment/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

ASP.NET Core 依環境載入不同 appsetting.json 設定-黑暗執行緒

.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。

Fig1_638078294992012825.png

三個 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:

Fig2_638078294995552656.png

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

Fig3_638078294999184881.png

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

Fig4_638078295001091344.png

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

Fig5_638078295002884795.png

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

Fig6_638078295004764370.png

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

Fig7_638078295006590023.png

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

Fig8_638078295009063316.png

演練完畢。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK