您所在的位置:

首页> 要闻 > >
.NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署

时间:2023-06-02 13:52:59    来源:博客园

〇、前言

日常开发中,程序的环境切换是相当频繁的了,如果不同环境中的某些参数不同,那就需要每次编辑之前手动进行修改,比较麻烦,效率低下。

本文将以 .NET Core WebAPI 项目的配置方法为例,分步骤实现根据环境变量的配置参数,自动读取对应配置文件中的特殊参数值,从而达到 Development、Staging、Production 三种环境的无感部署。

一、配置文件

程序一般默认只有一个配置文件:appsettings.Development.json。


(相关资料图)

需要手动添加另外两个:appsettings.Staging.json、appsettings.Production.json。

原配置文件中,默认只有一个节点:Logging,如下:

{  "Logging": {    "LogLevel": {      "Default": "Information",      "Microsoft": "Warning",      "Microsoft.Hosting.Lifetime": "Information"    }  }}

需要手动添加一个与 Logging 同级的节点,名称自定义,如下示例:

{  "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"      }    ]  }}

注意,三个配置文件中需要加上完全一样的参数名称,然后根据环境不同配置不同的值。

二、程序读取配置

接下来就是在程序中配置读取了,在控制器的构造函数添加环境判断,然后取出配置文件中新增节点的值备用。

以下实例,包含了读取 字符值、列表值 两种:

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 keyValuePairs = new Dictionary();    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 _cacheDict;    static AppConfigure()    {        _cacheDict = new ConcurrentDictionary();    }    // 传入 JSON 文件夹路径与当前的环境变量值    public static IConfigurationRoot GetConfigurationRoot(string jsonDir, string environmentName = null)    {        // 设置缓存的 KEY        var cacheKey = $"{jsonDir}#{environmentName}";        // 添加默认的 JSON 配置        var builder = new ConfigurationBuilder().SetBasePath(jsonDir)            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);        // 根据环境变量添加相应的 JSON 配置文件        if (!string.IsNullOrEmpty(environmentName))        {            builder = builder.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true);        }        // 返回构建成功的 IConfigurationRoot 对象        return builder.Build();    }}
三、Windows 服务器配置

最后就是配置 Windows 服务器的环境变量了,用来标识程序运行的环境。

如下图,根据需要配置不同的环境变量:

ASPNETCORE_ENVIRONMENT:DevelopmentASPNETCORE_ENVIRONMENT:StagingASPNETCORE_ENVIRONMENT:Production

至此,就配置完成了。

注意:如果设置完环境变量还是不能读取指定的配置,可以参考下这个:https://blog.csdn.net/lilinoscar/article/details/108362211

标签: