首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
C#怎么实现配置文件读写_C#如何读取App.config和appsettings.json【教程】

C#怎么实现配置文件读写_C#如何读取App.config和appsettings.json【教程】

热心网友
12
转载
2026-04-28

C#怎么实现配置文件读写_C#如何读取App.config和appsettings.json【教程】

C#怎么实现配置文件读写_C#如何读取App.config和appsettings.json【教程】

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

开门见山,先说一个核心结论:App.config 在现代 .NET 开发中已经出局,而 appsettings.json 虽然是标准,但它的设计初衷是“只读”的。 这意味着,如果你想让应用在运行时动态修改配置并持久化保存,指望框架自动帮你双向同步,那可就找错方向了。真正的解决方案,是手动构建配置对象并直接操作 JSON 文件本身。

App.config 在现代 C# 项目里根本不能“写”

首先得明确,App.config 是 .NET Framework 时代的产物。那时候,大家习惯用 ConfigurationManager.AppSettings[“key”] 来读取配置,感觉挺方便。但问题在于,这个机制从设计上就是只读的。你或许尝试过修改值然后调用 Sa ve(),结果发现要么不生效,要么只在当前进程内存里变了一下,应用一重启,改动就全丢了。

到了 .NET Core / .NET 5+ 的时代,情况就更彻底了:

  • 新建的 .NET 6/7/8 项目,默认根本不会包含 App.config 文件。
  • 即便你手动添加一个,运行时也不会自动加载它。
  • 更关键的是,即便你强行想用旧方法,比如调用 ConfigurationManager.OpenExeConfiguration,在 .NET Core+ 平台上,等待你的很可能是一个 PlatformNotSupportedException 异常。Visual Studio 编译时确实会把 App.config 复制为 MyApp.exe.config,但运行时根本不会监听这个文件的任何变更。

所以,结论很清晰:对于新项目,App.config 这条路可以直接放弃了。

appsettings.json 只能读,不能直接写

既然 App.config 不行,那转向标准的 appsettings.json 总可以了吧?很遗憾,这里也有一个常见的误解。我们通过依赖注入拿到的 IConfiguration 接口,它提供的是 GetSection()GetValue() 等一系列读取方法,但翻遍文档,你也找不到一个官方的 Set()Sa ve() 方法。

这是为什么呢?因为 IConfiguration 本质上是一个配置源的只读快照。它的背后可能串联着 JSON 文件、环境变量、命令行参数、内存字典等多个来源。这种设计是为了灵活性和优先级合并,但也意味着它没有“写回”某个特定源(比如 JSON 文件)的职责。

  • 如果你试图通过一些“黑魔法”(比如强制转换类型)去修改 IConfiguration 实例内部的状态,这属于未公开的行为,不同版本的 .NET SDK 可能导致不可预知的后果,甚至程序崩溃。
  • 当然,你可以手动用 JsonSerializer.Serialize() 把配置写回 JSON 文件,但这意味着你必须自己处理一堆麻烦事:并发写入冲突、保持 JSON 的格式缩进、处理注释丢失等等。
  • 还有一个棘手的问题:如果你的配置项混合了多个来源(比如数据库连接字符串来自 appsettings.json,而日志级别来自环境变量),那么“写回文件”这个操作本身就无法还原这种复杂的来源逻辑。

所以,appsettings.json 本身不是用来“写”的,IConfiguration 也不是那个负责持久化的对象。

真要实现“可写配置”,得绕过 IConfiguration 直接操作 JSON 文件

那么,正确的姿势到底是什么?答案是:绕过 IConfiguration 的只读抽象层,直接对 appsettings.json 这个物理文件进行读写操作。 这是最可控、最可预测的方法。

具体步骤可以分解如下:

  • 读取与解析:首先,使用 File.ReadAllText(“appsettings.json”) 将文件内容完整读入,然后通过 System.Text.JsonNewtonsoft.Json 将其反序列化。你可以反序列化为灵活的 JsonDocument,或者更常见的,映射到一个预先定义好的 POCO(普通C#类)模型上。
  • 修改配置:在内存中修改这个模型对象的属性值,比如 settings.Logging.LogLevel.Default = “Debug”;
  • 写回与重载:使用 JSON 序列化器将修改后的对象重新序列化为字符串,并用 File.WriteAllText 写回原文件。这里有个关键点:为了保持文件可读性,建议在序列化时设置 WriteIndented = true。写入完成后,调用之前保存的 IConfigurationRoot.Reload() 方法,触发配置系统重新加载文件,使改动立即生效。
// 构建配置时,确保获取到 IConfigurationRoot 的引用
var config = new ConfigurationBuilder()
    .AddJsonFile(“appsettings.json”, optional: false, reloadOnChange: true)
    .Build();
var root = (IConfigurationRoot)config;

// 直接读写 JSON 文件
var settings = JsonSerializer.Deserialize(File.ReadAllText(“appsettings.json”));
settings.Logging.LogLevel.Default = “Debug”;
File.WriteAllText(“appsettings.json”, JsonSerializer.Serialize(settings, new JsonSerializerOptions { WriteIndented = true }));

// 触发配置重载
root.Reload();

需要提醒的是,在写回文件前,强烈建议对原文件进行备份。这样可以防止万一序列化过程出错导致 JSON 格式损坏,从而避免应用下次启动时直接失败。

别忽略 reloadOnChange 和文件权限这两个硬限制

即使你按照上面的流程操作,还有两个底层限制必须心里有数,它们常常在部署后成为“幽灵问题”。

第一个是关于 reloadOnChange: true。这个选项依赖于 FileSystemWatcher 来监听文件变化,但它并非百分百可靠:

  • 在 Docker 容器环境中,尤其是 Windows 主机搭配 Linux 容器时,挂载卷(Volume)的文件变更事件经常无法正确触发。
  • 如果 appsettings.json 文件被其他进程(如 Visual Studio 正在编辑,或者记事本没有关闭)以独占方式打开,重载可能会静默失败。

第二个,也是更实际的限制,是文件系统权限

  • 在 Linux 系统上部署时,如果运行应用的用户(比如 www-data)没有对 appsettings.json 文件的读取权限,应用在启动阶段就会抛出 UnauthorizedAccessException,根本到不了运行时。
  • 而“写”配置时,问题更突出:appsettings.json 通常位于应用程序集相同的目录。在生产环境中,无论是 Linux 的 systemd 服务还是 Windows 服务,其运行账户默认往往没有对该目录的写入权限。如果你没提前配置好权限,写文件时会直接抛出异常。

所以,在实现可写配置功能的同时,务必把权限检查和异常处理纳入考量范围,这才是真正稳健的做法。

来源:https://www.php.cn/faq/2382738.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

PS搞什么?数字版游戏每30天强制联网!网友吵翻了
游戏评测
PS搞什么?数字版游戏每30天强制联网!网友吵翻了

索尼PlayStation近期的一项系统更新变动在玩家社区掀起了轩然大波。 事情已经得到证实:从2026年3月那次系统更新之后,所有通过数字渠道购买的PlayStation游戏,都将被套上一道新的数字版权管理(DRM)紧箍咒——你的主机每隔30天,必须联网“签到”一次,以验证游戏许可证的有效性。 这

热心网友
04.28
C#怎么实现配置文件读写_C#如何读取App.config和appsettings.json【教程】
编程语言
C#怎么实现配置文件读写_C#如何读取App.config和appsettings.json【教程】

C 怎么实现配置文件读写_C 如何读取App config和appsettings json【教程】 开门见山,先说一个核心结论:App config 在现代 NET 开发中已经出局,而 appsettings json 虽然是标准,但它的设计初衷是“只读”的。 这意味着,如果你想让应用在运行时动

热心网友
04.28
14年前索尼PS广告太炸裂!
游戏评测
14年前索尼PS广告太炸裂!

时隔十二年再度翻红,一条游戏广告为何争议依旧? 最近,社交媒体上掀起了一股“考古”风潮,一条发布于2012年的PS Vita广告被重新翻了出来,热度不减当年,在玩家社群中引发了新一轮的热烈讨论。 这条平面广告,是索尼为其掌机PlayStation Vita面向欧洲市场推出的,由法国著名的TBWA P

热心网友
04.26
PS+会员超值折扣下发!但原因让人大跌眼镜
游戏评测
PS+会员超值折扣下发!但原因让人大跌眼镜

Sony PlayStation Plus 订阅服务深度折扣解析:是福利还是策略? 如果你正在考虑续费 PlayStation Plus 会员,近期市场上出现的显著折扣值得你重点关注。许多玩家发现,索尼这项热门订阅服务悄然推出了力度可观的优惠活动,但这些折扣往往伴随着特定的“隐藏条款”与获取条件。

热心网友
04.26
RPA与Aiops分别是什么
业界动态
RPA与Aiops分别是什么

RPA与AIOps:当流程自动化遇上智能运维 说起企业降本增效,有两个技术名词这几年热度居高不下:一个是RPA(机器人流程自动化),另一个是AIOps(智能运维)。乍一听,它们好像各管一摊,但深究起来,内核都指向同一个方向——用自动化技术把人从重复、繁琐的工作中解放出来。 RPA:让软件机器人替你“

热心网友
04.26

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

Signlz AI : AI辅助PRD生成工具
AI
Signlz AI : AI辅助PRD生成工具

需求人群 如果你是一位产品经理或相关专业人士,正在为如何高效启动一个新项目、打磨一份专业的产品需求文档(PRD)而头疼,那么Signlz可能就是为你量身打造的工具。它核心解决的,就是帮助这个群体快速且高质量地迈出产品创新的第一步。 使用场景 那么,具体在哪些环节它能大显身手呢?最典型的,莫过于当你需

热心网友
04.28
GraphQL AI : AI开发者平台
AI
GraphQL AI : AI开发者平台

需求人群 如果你正在开发AI工具、机器人或者聊天助手,那么下面这个平台值得你特别关注。它瞄准的正是这个快速发展的开发者社区。 使用场景 具体能拿它来做什么呢?场景其实很丰富。比如,你可以用它快速搭建一个聊天机器人,来高效处理用户的那些常见问题,解放人力。艺术创作方面,它集成的图像生成模型能帮你产出风

热心网友
04.28
当Perps DEX进入下一阶段,交易者真正需要什么?
web3.0
当Perps DEX进入下一阶段,交易者真正需要什么?

2026 年 4 月,加密市场重新升温。BTC 一度触及 7 9 万美元,随后在 7 7 万美元附近震荡。随着资金回流、宏观预期变化和机构交易活跃,市场注意力再次回到 BTC 及其衍生品交易。 行情一旦回归,最先热闹起来的总是合约市场。更高的杠杆、更低的费用、更快的开仓速度,总能迅速把交易者拉回屏幕

热心网友
04.28
Vidby:字幕翻译配音服务,一款专业的AI视频翻译和配音工具
AI
Vidby:字幕翻译配音服务,一款专业的AI视频翻译和配音工具

想把你的视频内容传递给全世界的观众?语言障碍往往是最大的拦路虎。好在,现在有了专业的解决方案。Vidby,这款由瑞士Vidby AG公司打造的AI视频翻译与配音工具,正是为此而生。它能快速且精准地处理视频翻译、字幕生成和语音配音等一系列任务,帮你轻松跨越语言鸿沟。 那么,它是如何做到的呢?核心在于其

热心网友
04.28
百度:文心下一代模型 4.5 系列 6 月 30 日起开源
AI
百度:文心下一代模型 4.5 系列 6 月 30 日起开源

百度官宣文心大模型4 5系列将至,并定下开源时间表 情人节这天,国内AI领域迎来一则重磅消息。百度正式宣布,将在未来几个月内,逐步推出其文心大模型的下一代版本——4 5系列。而真正的重头戏在于,该系列模型将从今年6月30日起正式开源。这意味着,开发者与企业获得行业顶级大模型技术的门槛,将迎来一次显著

热心网友
04.28