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

.NET Core 实现 Windows 系统 Development、Staging、Production 三种环境的无感部署

时间:2023-06-08 16:24:51浏览次数:51  
标签:Development Core 读取 配置文件 public json true 无感

阅读目录


回到顶部

〇、前言

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

本文将以 .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"
  }
  ]
  }
  }

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

回到顶部

二、程序读取配置

1. 配置文件信息读取实现

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

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

  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 文件夹路径与当前的环境变量值
  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();
  }
  }

2. 关于本机测试

可以通过修改项目的初始设置文件(文件夹下 Properties-->launchSettings.json)修改当前的运行环境,也可以在项目属性的“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" // 修改切换运行环境: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 文件,仅用于本地开发计算机,不会被编译发布到生产环境,因此不能存储重要信息。

回到顶部

三、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

标签:Development,Core,读取,配置文件,public,json,true,无感
From: https://www.cnblogs.com/mq0036/p/17466822.html

相关文章

  • .net core 因路径原因导致的JSON解析错误
    因解析json配置文件导致的错误:JsonReaderException:'0xEF'isaninvalidescapablecharacterwithinaJSONstring.Thestringshouldbecorrectlyescaped.LineNumber如何解决?{  "path":"D:\工作资料\技术资料"}改为{   "path":"D:......
  • net-core-PeriodicTimer
    一在.NET6中引入了新Timer:System.Threading.PeriodicTimer,它和之前的Timer相比,最大的区别就是新的PeriodicTimer事件处理可以方便地使用异步,消除使用callback机制减少使用复杂度。publicclassBackgroundTask{privateTask?_timerTask;privatereadonlyPeriodic......
  • net core -Lock
    一读写锁publicasyncTask<byte[]>GetAsync(stringkey,CancellationTokentoken=newCancellationToken()){_cacheLock.EnterReadLock();try{returnawait_cache.GetAsync(GetCacheKey(key),t......
  • 【HMS Core】Health Kit查询历史数据查询数据和返回数据不一致
    【问题描述】查询一个月运动记录,只能查询到最早5月26的数据,但是华为健康app里的数据最早为5月8日,为什么会查询不到?【解决方案】1、需要检查是否申请了历史数据权限,查询数据时,出于对用户的数据保护,只允许开发者查询在用户授权之后的数据。例如用户是在2022年2月14日授权,那么2022年2......
  • 【HMS Core】Health Kit查询历史数据查询数据和返回数据不一致
    【问题描述】查询一个月运动记录,只能查询到最早5月26的数据,但是华为健康app里的数据最早为5月8日,为什么会查询不到? 【解决方案】1、需要检查是否申请了历史数据权限,查询数据时,出于对用户的数据保护,只允许开发者查询在用户授权之后的数据。例如用户是在2022年2月14日授权,那么2......
  • .net core WebAPI 初探及连接MySQL
    1.前言笔者最近跟着微软官方文档学习.netcoreWebAPI,但发现其对WebAPI连接数据库、读取数据库方面讲得不够细致明了。写此文的目的,即实现.netcoreWebAPI的GET、POST方法访问数据库,并输出结果。2.开发准备2.1操作系统Windows10/Windows72.2.netcoresdk.netcore......
  • net core-Scheduling Background Jobs With Quartz
    一安装包Install-PackageQuartz.Extensions.Hosting二注入依赖关系services.AddQuartz(configure=>{configure.UseMicrosoftDependencyInjectionJobFactory();});services.AddQuartzHostedService(options=>{options.WaitForJobsToComplete=true;});......
  • mysql使用efcore实现乐观并发控制
    为了避免多个用户同时操作同一个资源造成的并发冲突问题,通常需要进行并发控制。并发控制分为:乐观和悲观两策略悲观:悲观并发控制一般采用行锁、表锁等排它销对资源进行锁定,确保一个时间点只有一个用户在操作被锁定的资源。 悲观并发控件的使用比较简单,仅对要进行并发控制的资......
  • Taurus.mvc .Net Core 微服务开源框架发布V3.1.7:让分布式应用更高效。
    前言:自首个带微服务版本的框架发布:Taurus.MVCV3.0.3微服务开源框架发布:让.NET架构在大并发的演进过程更简单已经过去快1年了,在这近一年的时间里,版本经历了N个版本的迭代。如今,是时候写文章介绍一下了:以下介绍中,仅以.NetCore6为示例代码。框架支持在.NetFramework2.0+......
  • Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署
    运行环境照例,先亮环境;软件的话我这里假设你已经批准好了.netcore运行环境,未配置可以看我的这篇[linux(centos)搭建.netcore运行环境]腾讯云centos:7.2cpu:1核2G内存1M带宽docker:18.06.1-ce安装docker安装其实很简单,就不重复说了,请查看纯洁大神这篇文章准备你的.netcoreweb程......