Asp.Net Core 3.1:CreateHostBuilder配置修改未在Startup的ConfigureServices生效
嘿,我来帮你搞定这个ASP.NET Core配置不生效的问题!
你当前代码的问题在于:config.Build()返回的是只读的配置快照实例,你对它做的任何修改都不会同步到后续供Startup使用的配置对象里。ASP.NET Core的配置系统是基于「配置源」工作的,要修改配置,得通过添加/调整配置源来实现,而不是直接修改已构建的配置快照。
下面给你两种靠谱的解决方案:
方案一:用内存配置源覆盖原有值(推荐)
这种方法最简单直接,通过添加一个优先级更高的内存配置源来覆盖原有配置项。因为配置源是按加载顺序生效的,后面添加的源会覆盖前面的:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureAppConfiguration((context, config) => { // 添加内存配置源,直接覆盖ConnString:Value的值 config.AddInMemoryCollection(new Dictionary<string, string> { {"ConnString:Value", "MY CONNECTION STRING"} }); }); webBuilder.UseStartup<Startup>(); });
修改后,你在Startup的ConfigureServices里就能正常读取到更新后的连接字符串了。
方案二:修改现有JSON配置源(适合需要持久化修改的场景)
如果你的初始配置来自appsettings.json这类JSON文件,且需要修改原文件对应的配置内容,可以用这种方式(不过一般不推荐硬编码修改配置文件,除非特殊需求):
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureAppConfiguration((context, config) => { // 找到JSON格式的配置源(比如appsettings.json) var jsonSource = config.Sources.OfType<JsonConfigurationSource>().FirstOrDefault(); if (jsonSource != null) { // 加载原有配置数据 var configData = JsonConfigurationProvider.Load(jsonSource); // 修改目标配置项 configData["ConnString:Value"] = "MY CONNECTION STRING"; // 替换原配置源,让修改生效 config.Sources.Remove(jsonSource); config.Add(new JsonConfigurationSource { Path = jsonSource.Path, Optional = jsonSource.Optional, ReloadOnChange = jsonSource.ReloadOnChange, Provider = new JsonConfigurationProvider(jsonSource) { Data = configData } }); } }); webBuilder.UseStartup<Startup>(); });
额外提示
如果你的连接字符串需要根据环境(比如开发/生产)动态设置,也可以结合环境变量、命令行参数等配置源,ASP.NET Core的默认配置加载顺序已经帮你处理好了优先级,只需要在ConfigureAppConfiguration里添加对应源即可。
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

