将 IConfigurationRoot 部分的更改保存到 .net Core 2.2 中的 *.json 文件

2023-11-28

我正在挖掘寻找解决方案,但没有找到它,我敢打赌有人遇到过这个问题,那么问题是什么?

为了测试,我创建了简单的控制台应用程序(解决方案将在 asp.net core web api 中使用)。

我有 TestSetting.json 配置文件,设置了“始终复制”。

{
  "setting1" : "value1" 
}

和简单的代码

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();

IConfigurationRoot configuration = configurationBuilder.AddJsonFile("TestSettings.json",false, reloadOnChange: true).Build();

Console.WriteLine(configuration.GetSection("setting1").Value); // Output: value1
//Change configuration manually in file while console is waiting
Console.ReadKey();

//Changed manually in file Value appears
Console.WriteLine(configuration.GetSection("setting1").Value); // Output: Whatever you have setuped
Console.ReadKey();

configuration.GetSection("setting1").Value = "changed from code";
//Changed in code value appear
Console.WriteLine(configuration.GetSection("setting1").Value); // Output: changed from code

我有 2 个要求,我希望能够在应用程序运行时手动更改 json 配置文件中的值,并且应用程序将在下次获取设置部分期间看到更新的值并且它正在工作。

第二个要求是,我想保留一些信息,以准确确定任务的最后执行时间,该任务应在每个设置的周期内执行一次。每天一次,所以一些循环检查最后执行时间值并确定是否必须执行操作。有人会问我所拥有的将起作用,但我还需要涵盖操作已执行且应用程序已重新启动(服务器错误、用户重新启动等)时的场景,并且我需要以允许我的方式保存此信息在应用程序启动后读取它。

阅读代码示例,我们可以看到,在更改代码中的设置1后,我们发现该部分在尝试将其输出到控制台时已被更改。

configuration.GetSection("setting1").Value = "changed from code";
//Changed in code value appear
Console.WriteLine(configuration.GetSection("setting1").Value); // Output: changed from code

问题来了:)。此设置部分的更改是否可能也会影响 json 文件中的实际值?我不想由某些流编写者或其他人手动更改此文件。

实际结果是:更改代码中的值后,新值可以在运行时获取,但是当您去调试二进制文件时,您会发现 TestSettings.json 文件中的 value1 尚未更改。


谢谢“Matt Luccas Phaure Jensen”对于这个信息,我还没有找到任何解决方案。如果有人想使用 IOptions 这里是一个答案如何做到这一点如何将值更新到 appsettings.json 中?

我想按照我开始的方式来做,所以我查看了 Microsoft.Extensions.Configuration.Json 的实现,并且我准备了简单的解决方案来允许编写和使用基本实现。它可能有很多限制,但它可以在简单的场景中工作。

必须扩展上述 dll 的两个实现。那么让我们开始吧。

Files to create

使用所需部分的示例保存代码实现 WritableJsonConfigurationProvider。

更改 JSON 文件中的值(写入文件)

public class WritableJsonConfigurationProvider : JsonConfigurationProvider
{
    public WritableJsonConfigurationProvider(JsonConfigurationSource source) : base(source)
    {
    }

    public override void Set(string key, string value)
    {
        base.Set(key,value);

        //Get Whole json file and change only passed key with passed value. It requires modification if you need to support change multi level json structure
        var fileFullPath = base.Source.FileProvider.GetFileInfo(base.Source.Path).PhysicalPath;
        string json = File.ReadAllText(fileFullPath);
        dynamic jsonObj = JsonConvert.DeserializeObject(json);
        jsonObj[key] = value;
        string output = JsonConvert.SerializeObject(jsonObj, Formatting.Indented);
        File.WriteAllText(fileFullPath, output);
    }
}

以及 Writable JsonConfigurationSource 的实现,它是 JsonConfigurationSource 的扩展

public class WritableJsonConfigurationSource : JsonConfigurationSource
{
    public override IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        this.EnsureDefaults(builder);
        return (IConfigurationProvider)new WritableJsonConfigurationProvider(this);
    }
}

就是这样,让我们​​使用它

IConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
IConfigurationRoot configuration = configurationBuilder.Add<WritableJsonConfigurationSource>(
    (Action<WritableJsonConfigurationSource>)(s =>
                                                     {
                                                         s.FileProvider = null;
                                                         s.Path = "TestSettings.json";
                                                         s.Optional = false;
                                                         s.ReloadOnChange = true;
                                                         s.ResolveFileProvider();
                                                     })).Build();

Console.WriteLine(configuration.GetSection("setting1").Value); // Output: value1
Console.ReadKey();

configuration.GetSection("setting1").Value = "changed from codeeee";
Console.WriteLine(configuration.GetSection("setting1").Value); // Output: changed from codeeee

Console.ReadKey();

内存和文件中的值都在更改。Bingo :).

代码可能有问题,可以重构等,这只是示例快速解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 IConfigurationRoot 部分的更改保存到 .net Core 2.2 中的 *.json 文件 的相关文章

  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • C++中的类查找结构体数组

    我正在尝试创建一个结构数组 它将输入字符串链接到类 如下所示 struct string command CommandPath cPath cPathLookup set an alarm AlarmCommandPath send an
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 如何检查 Cassandra 节点是否准备就绪?

    我有一个在 Docker 容器中运行的 Cassandra 节点 我想在数据库准备就绪时启动 CQL 脚本 我尝试检查端口以检测它何时准备就绪 while nc z localhost 7199 do sleep 1 done echo C
  • 如何从本地网络上的另一台机器访问docker容器

    我正在使用 Docker for Windows 我没有使用使用虚拟机的 Docker Toolbox 但我无法从本地网络上的另一台计算机看到我的容器 在我的主机中 一切都很完美并且运行良好 但是 我希望其他人使用我的容器 尽管发布了Doc
  • 非临时指令如何工作?

    我正在阅读每个程序员都应该了解的内存知识乌尔里希 德雷珀 Ulrich Drepper pdf在第 6 部分的开头有一个代码片段 include
  • Javascript ES6 共享类变量

    我有一堂课 看起来像这样 class Foo constructor arg1 arg2 this some obj new SomeObj param1 arg1 param2 arg2 module exports Foo 现在我想做同
  • Bootstrap Glyphicons datetimepicker 更改图标

    我正在使用 Bootstrap 日期时间选择器https eonasdan github io bootstrap datetimepicker 正如文档中提到的 我成功地使用下面的代码更改了向上 向下箭头 datetimepicker7
  • 如何配置 Pex 以尊重代码契约?

    鉴于以下示例代码 我如何配置 Pex 以遵守我的代码契约 public static IEnumerable
  • Elasticsearch 数组属性必须包含给定的数组项

    我的文件看起来像 tags gt tag1 tag2 name gt Example 1 tags gt tag1 tag3 tag4 name gt Example 2 我现在想要的是进行术语搜索 其中给定的数组可能如下所示 tag1 t
  • Google Play 应用程序页面的 Google Analytics(分析)

    我想分析人们使用哪些搜索关键字在 Play 商店中查找我的应用 那可能吗 我怎样才能这样做呢 自 2013 年 10 月起 您可以将 Google Analytics 和 Google Play 帐户关联起来 以查看应用程序页面的浏览量以及
  • RGB 值到 HSL 转换器

    Google 地图 API v3 允许将 样式 应用于地图 包括设置各种要素的颜色 然而 它使用的颜色格式是 HSL 或者看起来像这样 色调 RGB 十六进制字符串 亮度 100 到 100 之间的浮点值 饱和度 100 到 100 之间的
  • MEDIA_TYPE_IMAGE 无法识别

    我在使用 Android 开发人员的相机资源时遇到问题 这是我的代码 create Intent to take a picture and return control to the calling application Intent
  • 填写 jasper 报告时的进展

    我想在 Jasper 报告填写编译报告时向用户提供进度 基本上我希望在执行时取得进展 JasperFillManager fillReport JasperReport rpt 地图参数 JRDataSource src 有办法实现这个目标
  • 比较 XML 忽略元素顺序

    使用 XMLUnit 2 如何在不考虑元素顺序的情况下比较两个文档 I got XMLUnit 1 的这个问题 但显然 v2 中的新 API 不再有提到的方法了 这是我当前的代码 Diff diff DiffBuilder compare
  • aks 报告“pod 不足”

    我已经完成了 Azure Cats Dogs 教程中描述的内容here我在 AKS 中启动应用程序的最后一步中遇到错误 Kubernetes 报告我的 Pod 不足 但我不确定为什么会出现这种情况 几周前我已经完成了相同的教程 没有出现任何
  • Firefox、IE9+ 在 td 内出现 div 高度 100% 的问题(Chrome 上的工作示例)

    拿着它 http jsfiddle net zVscL 4 edit me height 100 does not behave the same as Chrome width 10px border 1px solid blue bac
  • 如何使用 git 正确处理 GreaseMonkey 用户脚本?

    我正在为 Firefox 编写用户脚本 所以我使用油猴 另外 为了方便开发 我使用git更新我的代码的不同版本 现在 让我尝试解释一下这个问题 当我将本地 git 目录中的用户脚本添加到 GreaseMonkey 时 就会在 Firefox
  • Rails .where 与 .find

    我注意到Model where即使只有一个结果 方法也始终返回一个数组Model find方法没有 这有什么原因吗 我想Model where是自 Rails 3 X 以来的首选函数 我应该使用Model find当我期望一个结果并且Mod
  • 为什么 JavaScript 中的 new Number(2) != new String("2")

    以下评价为true new Number 2 2 new String 2 2 显然 但请执行以下操作 2 2 new Number 2 2 new String 2 2 那么有人可以清楚地解释为什么他下面的评价false new Numb
  • 我可以将层归一化与 CNN 结合使用吗?

    我发现层归一化是比批量归一化更现代的归一化方法 并且在 Tensorflow 中编码非常简单 但我认为层归一化是为 RNN 设计的 批量归一化是为 CNN 设计的 我可以使用 CNN 的层归一化来处理图像分类任务吗 选择批量归一化或层的标准
  • 从列表中删除项目[重复]

    这个问题在这里已经有答案了 在循环列表时 我想根据条件删除列表中的项目 请参阅下面的代码 这给了我一个ConcurrentModification例外 for Object a list if a getXXX equalsIgnoreCa
  • 将 IConfigurationRoot 部分的更改保存到 .net Core 2.2 中的 *.json 文件

    我正在挖掘寻找解决方案 但没有找到它 我敢打赌有人遇到过这个问题 那么问题是什么 为了测试 我创建了简单的控制台应用程序 解决方案将在 asp net core web api 中使用 我有 TestSetting json 配置文件 设置