.NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署
〇、前言
日常开发中,程序的环境切换是相当频繁的了,如果不同环境中的某些参数不同,那就需要每次编辑之前手动进行修改,比较麻烦,效率低下。
本文将以 .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 三种环境的无感部署的更多相关文章
- java程序在windows系统作为服务程序运行
Java程序很多情况下是作为服务程序运行的,在Un*x 平台下可以利用在命令后加“&”把程序作为后台服务运行,但在Windows下看作那个Console窗口在桌面上,你是否一直担心别的同时把你 ...
- .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源
物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
- 使用Cobbler批量部署Linux和Windows:Windows系统批量安装(三)
Tutorial: Installing Windows with cobbler (cobbler安装Windows) Windows系统的自动安装需要用到Win PE工具.流程如下: 定制Win ...
- windows系统下简单nodejs安装及环境配置
相信对于很多关注javascript发展的同学来说,nodejs已经不是一个陌生的词眼,这里不想谈太多的nodejs的相关信息.只说一下,windows系统下简单nodejs环境配置 相信 ...
- iOS开发——程序员必备&iOS安装包的三种格式 deb、ipa 和 pxl的解释和说明
iOS安装包的三种格式 deb.ipa 和 pxl的解释和说明 目前 iOS 平台上常见的安装包有三种,deb.ipa 和 pxl.转自链接:http://fanlb.blogbus.com/logs ...
- 【转】delphi程序只允许运行一个实例的三种方法:
一. 创建互斥对象 在工程project1.dpr中创建互斥对象 Program project1 Uses Windows,Form, FrmMain in 'FrmMain.pas' ...
- 本机向windows服务器传输文件的三种方法
闲来无事,在腾讯云上申请了一个免费的服务器,想将自己写的网页发布到服务器上,服务器的申请很简单,百度搜索 腾讯云 ,然后新人第一次注册能申请到免费一个月的云主机,虽然配置不怎么高,但是还是能用的,这是 ...
- 【C# 线程】IOCP IO完成端口-Windows系统下常见的7种I/O模型
一.IOCP(I/O Completion Ports)简介 要实现异步通信,必须要用到一个很风骚的I/O数据结构 ,叫重叠结构"Overlapped",Window ...
- Windows系统结合MinGW搭建软件开发环境
MinGW介绍 MinGW,即Minimalist GNU For Windows,它包含了GNU工具集的运行环境.GCC编译器工具集以及其它的GNU程序开发工具(如make.gawk.grep等等) ...
- .net core 2.0 WIndows IIS下发布(WIN 10环境)
最近在做练习,发布.net core webapi在本机IIS上,使用.net core的文件系统发布到IIS后,出现错误 500.19 观察了下页面如下 查阅资料才知道是少安装了一个DotNetCo ...
随机推荐
- Django-5
Django-5 1.Coookie 1.1 什么是cookie Cookie是储存在浏览器端的一小段文本数据(键值对). 被广泛用于在网站之间传输信息, 当您访问一个网站时,它会将一个Cookie发 ...
- vue 前端项目创建
一.创建项目 将vue-admin-template-master 模板放入创建的 VS code 的工作空间.重命名为自己的项目. 模块获取方法:关注"Java程序员进阶",回复 ...
- 最强分布式搜索引擎——ElasticSearch
最强分布式搜索引擎--ElasticSearch 本篇我们将会介绍到一种特殊的类似数据库存储机制的搜索引擎工具--ES elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以 ...
- react状态管理器(分模块)之redux和redux + react-redux + reducer和redux + react-redux + reducer分模块 + 异步操作redux-thunk
1.回顾 cnpm i redux react-redux redux-thunk -S store/index.js src/index.js src/views/home/index.jsx + ...
- CentOS8 搭建zabbix监控系统
哈喽,有些时间没有更新公众号.今日更新一下. 安装MySQL数据库 # 安装wget [root@cby ~]# dnf install wget -y # 下载MySQL源 [root@cby ~] ...
- python入门教程之二十四Python MySQL - mysql-connector 驱动
MySQL 是最流行的关系型数据库管理系统,如果你不熟悉 MySQL,可以阅读我们的 MySQL 教程. 本章节我们为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql ...
- CommunityToolkit.Mvvm8.1 viewmodel使用-旧式写法(2)
本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html 0.说明 CommunityToolkit.Mvvm8.1有一个重大更新的功 ...
- Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?
系列文章 Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用,相比 Terraform OSS, 用 ...
- windows下MinGW编译ffmpeg
windows下MinGW编译ffmpeg 1.官网下载MinGW并安装 1)下载 ,下载网址: https://sourceforge.net/projects/mingw/files/ ...
- RTSP&IGMP详解
RTSP协议 一.概述 1)RTSP(Real ...