〇、前言

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

本文将以 .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<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();
}
}

三、Windows 服务器配置

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

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

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

  

至此,就配置完成了。

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

.NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署的更多相关文章

  1. java程序在windows系统作为服务程序运行

    Java程序很多情况下是作为服务程序运行的,在Un*x 平台下可以利用在命令后加“&”把程序作为后台服务运行,但在Windows下看作那个Console窗口在桌面上,你是否一直担心别的同时把你 ...

  2. .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源

    物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  3. 使用Cobbler批量部署Linux和Windows:Windows系统批量安装(三)

    Tutorial: Installing Windows with cobbler (cobbler安装Windows) Windows系统的自动安装需要用到Win PE工具.流程如下: 定制Win ...

  4. windows系统下简单nodejs安装及环境配置

      相信对于很多关注javascript发展的同学来说,nodejs已经不是一个陌生的词眼,这里不想谈太多的nodejs的相关信息.只说一下,windows系统下简单nodejs环境配置     相信 ...

  5. iOS开发——程序员必备&iOS安装包的三种格式 deb、ipa 和 pxl的解释和说明

    iOS安装包的三种格式 deb.ipa 和 pxl的解释和说明 目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl.转自链接:http://fanlb.blogbus.com/logs ...

  6. 【转】delphi程序只允许运行一个实例的三种方法:

    一.        创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' ...

  7. 本机向windows服务器传输文件的三种方法

    闲来无事,在腾讯云上申请了一个免费的服务器,想将自己写的网页发布到服务器上,服务器的申请很简单,百度搜索 腾讯云 ,然后新人第一次注册能申请到免费一个月的云主机,虽然配置不怎么高,但是还是能用的,这是 ...

  8. 【C# 线程】IOCP IO完成端口-Windows系统下常见的7种I/O模型

    一.IOCP(I/O Completion Ports)简介        要实现异步通信,必须要用到一个很风骚的I/O数据结构 ,叫重叠结构"Overlapped",Window ...

  9. Windows系统结合MinGW搭建软件开发环境

    MinGW介绍 MinGW,即Minimalist GNU For Windows,它包含了GNU工具集的运行环境.GCC编译器工具集以及其它的GNU程序开发工具(如make.gawk.grep等等) ...

  10. .net core 2.0 WIndows IIS下发布(WIN 10环境)

    最近在做练习,发布.net core webapi在本机IIS上,使用.net core的文件系统发布到IIS后,出现错误 500.19 观察了下页面如下 查阅资料才知道是少安装了一个DotNetCo ...

随机推荐

  1. 使用Mathematica做序列的DTFT的几个例子

    ListFourierSequenceTransform[{-2, -1, 1, 3, 3, 1, -1, -2}, \[Omega]] ParametricPlot[{Re[%], Im[%]}, ...

  2. 从零开始学Java系列之Java是什么?它到底是个啥?

    全文大约[5000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货!文章带有丰富案例及配图,只为让你更好的理解和运用文中的技术概念,给你带来具有足够的思想启迪...... ----------- ...

  3. JVM Dump分析

    Thread Dump介绍 Thread Dump是非常有用的诊断 Java应用问题的工具.每一个 Java虚拟机都有及时生成所有线程在某一点状态的 thread-dump的能力,虽然各个 Java虚 ...

  4. Netty ByteBuf 详解

    ByteBuf类:Netty的数据容器 ByteBuf 维护了两个不同的索引:① readerIndex:用于读取:② writerIndex:用于写入:起始位置都从0开始:​名称以 read或者 w ...

  5. day12-SpringBoot数据库操作

    SpringBoot数据库操作 1.JDBC+HikariDataSource 在SpringBoot 2.x项目中,默认使用Hikari连接池管理数据源.相比于传统的 C3P0 .DBCP.Tomc ...

  6. 机器学习基础05DAY

    分类算法之k-近邻 k-近邻算法采用测量不同特征值之间的距离来进行分类 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 使用数据范围:数值型和标称型 一个例子弄懂k-近 ...

  7. java开发技术栈如何选型

    前言 2023泰山景区门票免费政策是从1月21日到3月31,今天4.1起不再免费啦,泰山的人.山和系统终于平安的渡劫过去! 洪峰时疯狂的抢票.各类攻击,分销MT两次凌晨抗洪事件,我及其我的团队又一次得 ...

  8. selenuim文件的下载

    文件下载:谷歌浏览器则会自动实现下载,不会弹出框提示,会直接下载谷歌的默认路径:火狐浏览器下载会弹出提示框,此时火狐需要添加浏览器的配置参数信息: 火狐的相关浏览器配置参数可以通过about:conf ...

  9. day03-搭建微服务基础环境02

    搭建微服务基础环境02 3.创建使用会员微服务模块-service consumer 3.1需求分析 浏览器向service consumer请求某个数据,service consumer会去向ser ...

  10. 一些随笔 No.2

    数据库 单表VS多表联合 多表联合查询的优势区域在于敏捷开发,主要用于过于庞大却可拆分的储存需求 但是劣势也很明显:更多的查询约束条件会用掉数据库服务器额外的cpu/内存/io,也不方便更未来的分布式 ...