- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
日常开发中,程序的环境切换是相当频繁的了,如果不同环境中的某些参数不同,那就需要每次编辑之前手动进行修改,比较麻烦,效率低下.
本文将以 .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 服务器的环境变量了,用来标识程序运行的环境.
如下图,根据需要配置不同的环境变量:
至此,就配置完成了.
注意:如果设置完环境变量还是不能读取指定的配置,可以参考下这个: https://blog.csdn.net/lilinoscar/article/details/108362211 。
最后此篇关于.NETCore程序实现Windows系统Development、Staging、Production三种环境的无感部署的文章就讲到这里了,如果你想了解更多关于.NETCore程序实现Windows系统Development、Staging、Production三种环境的无感部署的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在 A 和 B 两个团队工作。因此我需要创建和安装两个开发证书。当我在 Xcode 的“build设置”中将“代码签名身份”设置为一般值“iOS Developer”时,我两个团队的应用程序正在构建
我刚刚将 XCode 升级到 4.3.1。我正在使用脚本来构建(然后通过 Testflight 部署)我的应用程序。但我现在收到此错误: Error: No developer directory f
我找不到在 Firefox Developer Edition 56.0b4 上的所有 .js 和 .css 文件中搜索字符串的方法。 我找到了办法,但那是在52版本之前。我想知道为什么他们删除了这个
我制作了一个 Gatsby starter,两个不同的人向我报告说他们无法运行它,因为它在构建“开发包”时卡住了。开发和生产构建都不起作用。我无法在我自己的机器上重现这个问题,但我想为想要使用我的 s
我正在尝试创建一个过去 3 周的苹果开发者帐户。选择后 “选择您的实体类型 = 个人”和“条款和条件 = 同意” 出现错误提示“您的注册无法完成”。我给支持打了几次电话,发了几次邮件,他们都只是简单地
我会使用robovm填写我正在使用Android libgdx进行研究的应用程序,但我无法识别证书。 xcode首选项中的证书已正确下载,然后通常可以正常使用....我做了什么,因为它已过期,然后我使
如何禁用 同源政策在 Firefox 开发者版中。出于某种原因,我认为在 Developer Edition 中执行此操作应该很容易,但我找不到设置。 最佳答案 老实说,您不应该在任何浏览器中执行此操
我有一个提交列表(最新的在前): abcd4 message abcd3 wrong commit message2 abcd2 wrong commit message1 abcd1 message
假设当前分支是 MyFeatureX。并且本地 develop 分支是最新的。下面的两个陈述是等价的吗?推荐的语法是什么? git rebase origin/develop git rebase d
我刚刚 merge 了我的整个 develop history历史进入我的主分支。正如我所见,应该连接 network graph 中的两个分支,它没有。另外,我的主分支显示:This branch
嗨,我有一个基于主分支的开发分支。 我在开发分支中进行了更改。 现在,我的问题是如果要更新 master 分支,如何在不丢失我在 develop 分支中的更改的情况下升级基于 master 分支的 d
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
与 firebug 相比,我更喜欢 firefox 开发人员检查器。 但是可以在原生 JS 控制台中显示 PHP 日志吗? 谢谢 :) 最佳答案 我刚刚安装了 Chrome Logger ( gith
今天我注意到我的 Mac 上有最新版本的 Xcode,一个在/Developer/Applications 中,另一个在/Applications 中。 /Applications 中的那个是 App
这很奇怪。显然,针对我的本地 develop 分支和远程 develop 分支进行 rebase 之间存在一些差异。以下是一些详细信息: 假设我有一个特性分支,feat,我不时对其进行 rebase:
这个问题在这里已经有了答案: difference between origin/branch_name and branch_name? (4 个答案) 关闭 5 年前。 我是新手,开始在项目中使
已经有很多关于此的问题回答了我的一些问题。我正在寻找在设置和管理这两个帐户方面有直接经验的人。 我有一种情况需要向超过 100 人发送私有(private) Beta 测试(iOS 的临时设备限制),
我想了解如何获取开发人员ID应用程序或开发人员ID安装程序证书的私钥? 开发人员ID证书只能由帐户持有者 https://developer.apple.com/support/roles/创建-完成
Mac Developer中的3rd Party Mac Developer Application和Code Signing Identity配置文件有什么区别?哪个是Mac App Store发行
我正在尝试使用 OminChannel 方法将 Google Pay 集成到我的网站中。官方文档提到 要打开 Google API 库,请从导航菜单中选择 API 和服务 > 库。搜索“NBU 付款
我是一名优秀的程序员,十分优秀!