经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Windows » 查看文章
.NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署
来源:cnblogs  作者:橙子家  时间:2023/6/2 11:01:21  对本文有异议

〇、前言

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

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

一、配置文件

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

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

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

  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Information",
  5. "Microsoft": "Warning",
  6. "Microsoft.Hosting.Lifetime": "Information"
  7. }
  8. }
  9. }

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

  1. {
  2. "Logging": {
  3. "LogLevel": {
  4. "Default": "Information",
  5. "Microsoft": "Warning",
  6. "Microsoft.Hosting.Lifetime": "Information"
  7. }
  8. },
  9. "MyPara": {
  10. "myparavalue": "测试文本",
  11. "myparavalue2": [
  12. {
  13. "key": "111",
  14. "value": "v111"
  15. },
  16. {
  17. "key": "222",
  18. "value": "v222"
  19. },
  20. {
  21. "key": "333",
  22. "value": "v333"
  23. }
  24. ]
  25. }
  26. }

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

二、程序读取配置

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

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

  1. using Microsoft.AspNetCore.Hosting;
  2. using Microsoft.Extensions.Configuration;
  3. [Route("api/[controller]/[action]")]
  4. [ApiController]
  5. public class SystemConfigController : ControllerBase // SystemConfig
  6. {
  7. public static IConfigurationRoot configurationRoot = null;
  8. // 示例只有两个字段,就用字典 Dictionary 来演示了,若字段较多时,可用实体对象 list
  9. public static Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
  10. public SystemConfigController(IWebHostEnvironment env)
  11. {
  12. try
  13. {
  14. configurationRoot = AppConfigure.GetConfigurationRoot(env.ContentRootPath, env.EnvironmentName);
  15. if (keyValuePairs.Count == 0) // 仅首次加载时读取
  16. {
  17. string flag = string.Empty;
  18. int i = 0;
  19. while (flag != null)
  20. {
  21. var keyinfo = configurationRoot[$"MyConfigPara:myparavalue2:{i}:key"];
  22. var valueinfo = configurationRoot[$"MyConfigPara:myparavalue2:{i}:value"];
  23. if (keyinfo != null && valueinfo != null)
  24. {
  25. keyValuePairs.Add(keyinfo, valueinfo); // 加入字典
  26. i++;
  27. }
  28. else
  29. flag = null;
  30. }
  31. }
  32. }
  33. catch (Exception ex)
  34. {
  35. // 日志框架记录日志
  36. }
  37. }
  38. public void TestAction()
  39. {
  40. // 读取配置文件具体值
  41. string myparavalue = configurationRoot["MyPara:myparavalue"];
  42. }
  43. }

配置文件读取帮助类:AppConfigure.cs。

  1. using Microsoft.Extensions.Configuration;
  2. using System.Collections.Concurrent;
  3. public static class AppConfigure
  4. {
  5. // 缓存字典
  6. private static readonly ConcurrentDictionary<string, IConfigurationRoot> _cacheDict;
  7. static AppConfigure()
  8. {
  9. _cacheDict = new ConcurrentDictionary<string, IConfigurationRoot>();
  10. }
  11. // 传入 JSON 文件夹路径与当前的环境变量值
  12. public static IConfigurationRoot GetConfigurationRoot(string jsonDir, string environmentName = null)
  13. {
  14. // 设置缓存的 KEY
  15. var cacheKey = $"{jsonDir}#{environmentName}";
  16. // 添加默认的 JSON 配置
  17. var builder = new ConfigurationBuilder().SetBasePath(jsonDir)
  18. .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
  19. // 根据环境变量添加相应的 JSON 配置文件
  20. if (!string.IsNullOrEmpty(environmentName))
  21. {
  22. builder = builder.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true);
  23. }
  24. // 返回构建成功的 IConfigurationRoot 对象
  25. return builder.Build();
  26. }
  27. }

三、Windows 服务器配置

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

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

  • ASPNETCORE_ENVIRONMENT:Development
  • ASPNETCORE_ENVIRONMENT:Staging
  • ASPNETCORE_ENVIRONMENT:Production

至此,就配置完成了。

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

原文链接:https://www.cnblogs.com/czzj/p/DSPConfig.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号