〇、前言
日常開發(fā)中,程序的環(huán)境切換是相當(dāng)頻繁的了,如果不同環(huán)境中的某些參數(shù)不同,那就需要每次編輯之前手動進行修改,比較麻煩,效率低下。
本文將以 .NET Core WebAPI 項目的配置方法為例,分步驟實現(xiàn)根據(jù)環(huán)境變量的配置參數(shù),自動讀取對應(yīng)配置文件中的特殊參數(shù)值,從而達到 Development、Staging、Production 三種環(huán)境的無感部署。
一、配置文件
程序一般默認只有一個配置文件:appsettings.Development.json。
需要手動添加另外兩個:appsettings.Staging.json、appsettings.Production.json。
?原配置文件中,默認只有一個節(jié)點:Logging,如下:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
}
}
?需要手動添加一個與 Logging 同級的節(jié)點,名稱自定義,如下示例:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"MyPara": {
"myparavalue": "測試文本",
"myparavalue2": [
{
"key": "111",
"value": "v111"
},
{
"key": "222",
"value": "v222"
},
{
"key": "333",
"value": "v333"
}
]
}
}
注意,三個配置文件中需要加上完全一樣的參數(shù)名稱,然后根據(jù)環(huán)境不同配置不同的值。
二、程序讀取配置
1. 配置文件信息讀取實現(xiàn)
接下來就是在程序中配置讀取了,在控制器的構(gòu)造函數(shù)添加環(huán)境判斷,然后取出配置文件中新增節(jié)點的值備用。
以下實例,包含了讀取 字符值、列表值 兩種:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
[Route("api/[controller]/[action]")]
[ApiController]
public class SystemConfigController : ControllerBase // SystemConfig
{
public static IConfigurationRoot configurationRoot = null;
// 示例只有兩個字段,就用字典 Dictionary 來演示了,若字段較多時,可用實體對象 list
public static Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
public SystemConfigController(IWebHostEnvironment env)
{
try
{
configurationRoot = AppConfigure.GetConfigurationRoot(env.ContentRootPath, env.EnvironmentName);
if (keyValuePairs.Count == 0) // 僅首次加載時讀取
{
string flag = string.Empty;
int i = 0;
while (flag != null)
{
var keyinfo = configurationRoot[$"MyConfigPara:myparavalue2:{i}:key"];
var valueinfo = configurationRoot[$"MyConfigPara:myparavalue2:{i}:value"];
if (keyinfo != null && valueinfo != null)
{
keyValuePairs.Add(keyinfo, valueinfo); // 加入字典
i++;
}
else
flag = null;
}
}
}
catch (Exception ex)
{
// 日志框架記錄日志
}
}
public void TestAction()
{
// 讀取配置文件具體值
string myparavalue = configurationRoot["MyPara:myparavalue"];
}
}
配置文件讀取幫助類:AppConfigure.cs。
using Microsoft.Extensions.Configuration;
using System.Collections.Concurrent;
public static class AppConfigure
{
// 緩存字典
private static readonly ConcurrentDictionary<string, IConfigurationRoot> _cacheDict;
static AppConfigure()
{
_cacheDict = new ConcurrentDictionary<string, IConfigurationRoot>();
}
// 傳入 JSON 文件夾路徑與當(dāng)前的環(huán)境變量值
public static IConfigurationRoot GetConfigurationRoot(string jsonDir, string environmentName = null)
{
// 設(shè)置緩存的 KEY
var cacheKey = $"{jsonDir}#{environmentName}";
// 添加默認的 JSON 配置
var builder = new ConfigurationBuilder().SetBasePath(jsonDir)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
// 根據(jù)環(huán)境變量添加相應(yīng)的 JSON 配置文件
if (!string.IsNullOrEmpty(environmentName))
{
builder = builder.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true);
}
// 返回構(gòu)建成功的 IConfigurationRoot 對象
return builder.Build();
}
}
2. 關(guān)于本機測試
可以通過修改項目的初始設(shè)置文件(文件夾下 Properties-->launchSettings.json)修改當(dāng)前的運行環(huán)境,也可以在項目屬性的“Debug”中修改,效果是一樣的,如下:
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:40493",
"sslPort": 44360
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "weatherforecast",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" // 修改切換運行環(huán)境:Development、Production、Staging
}
},
"Finance.ReconciliationPlatform": {
"commandName": "Project",
"dotnetRunMessages": "true",
"launchBrowser": true,
"launchUrl": "weatherforecast",
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
??
注意:launchSettings.json 文件,僅用于本地開發(fā)計算機,不會被編譯發(fā)布到生產(chǎn)環(huán)境,因此不能存儲重要信息。
三、Windows 服務(wù)器配置
最后就是配置 Windows 服務(wù)器的環(huán)境變量了,用來標識程序運行的環(huán)境。
如下圖,根據(jù)需要配置不同的環(huán)境變量:
- ASPNETCORE_ENVIRONMENT:Development
- ASPNETCORE_ENVIRONMENT:Staging
- ASPNETCORE_ENVIRONMENT:Production
注意:此方法配置的是服務(wù)器的環(huán)境變量,針對的是整臺機器的環(huán)境類型,若需求是在同一臺機器上配置多類型的程序,請參考后邊章節(jié)。
至此,就配置完成了。
四、如何在同一臺服務(wù)器 部署 兩種不同環(huán)境 的服務(wù)?
1、修改 Startup.cs 代碼,固定運行環(huán)境
通過在 Startup.cs 文件的 Configure() 方法中,賦值環(huán)境名稱(EnvironmentName
),以實現(xiàn)靈活控制程序的環(huán)境。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
env.EnvironmentName = "Production";
if (env.IsProduction()) // true
{
// 。。。
}
}
2、通過 IIS 配置服務(wù)的環(huán)境變量
通過 IIS 配置環(huán)境變量,也是區(qū)分生效范圍的:
- 若直接在根目錄的“配置編輯器”中配置,則其下的服務(wù)將是同一環(huán)境類型;(后續(xù)更新服務(wù)后值不變)
- 若針對單個服務(wù)的“配置編輯器”配置,則僅針對當(dāng)前服務(wù)。(缺點:每次服務(wù)更新后,需重新配置)
注意,針對服務(wù)的環(huán)境配置優(yōu)先級,高于根目錄的配置。繼承來的環(huán)境配置無法修改,要配置其他的環(huán)境,需要新增。
如下配置步驟:
(配置管理器 --> 根據(jù)路徑查找 system.webServer/aspNetCore --> system.webServer/aspNetCore --> 編輯項ASPNETCORE_ENVIRONMENT
填入指定的環(huán)境值Production、Staging、Development
)
文章來源:http://www.zghlxwxcb.cn/news/detail-468214.html
項路徑中另加服務(wù)名稱的就是在當(dāng)前服務(wù)新增的,另外一個則是從根目錄繼承來的,當(dāng)前新增的優(yōu)先級較高。文章來源地址http://www.zghlxwxcb.cn/news/detail-468214.html
到了這里,關(guān)于.NET Core 程序?qū)崿F(xiàn) Windows 系統(tǒng) Development、Staging、Production 三種環(huán)境的無感部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!