.NET 6中移动appsettings.json到其他项目后无法访问的解决方法
.NET 6 跨项目加载appsettings.json配置失效解决方案
核心原因
WebApplication.CreateBuilder(args) 默认的配置加载规则,只会从主WebApi项目的当前工作目录、编译输出目录扫描配置文件,不会主动遍历解决方案下其他引用项目的目录查找配置,因此把appsettings.json移到公共项目后,主项目默认路径下找不到对应文件,就会出现加载失败的问题。
可用方案
方案1:编译自动复制共享配置到主项目输出目录(推荐,维护成本最低)
不需要改动原有项目的目录结构,只需要保证公共项目的配置文件在编译、发布时自动同步到主项目的运行目录,操作步骤:
- 建议将公共项目中的共享配置文件重命名为
appsettings.Shared.json,避免和主项目自带的appsettings.json重名导致编译覆盖 - 右键点击公共项目中的共享配置文件,选择「属性」,将「复制到输出目录」设置为如果较新则复制
- 也可以直接在公共项目的
.csproj文件中添加如下配置,实现同样的效果:
<ItemGroup> <None Update="appsettings.Shared.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <!-- 如果有环境对应的共享配置,按相同规则添加即可 --> <None Update="appsettings.Shared.Development.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
- 在主WebApi项目的Program.cs中,追加共享配置文件的加载逻辑即可,原有代码不需要删除:
var builder = WebApplication.CreateBuilder(args); // 加载公共项目的共享配置 builder.Configuration.AddJsonFile("appsettings.Shared.json", optional: false, reloadOnChange: true); // 加载对应环境的共享配置 builder.Configuration.AddJsonFile($"appsettings.Shared.{builder.Environment.EnvironmentName}.json", optional: true, reloadOnChange: true); ConfigurationManager configuration = builder.Configuration;
方案2:直接指定共享配置的完整路径(适合目录结构固定的场景)
如果不想做文件复制,可以直接在代码中拼接公共项目下配置文件的路径,手动加载,注意发布时需要调整路径适配生产环境目录结构:
var builder = WebApplication.CreateBuilder(args); // 按照自己解决方案的实际目录层级调整相对路径 var solutionRootDir = Directory.GetParent(Directory.GetCurrentDirectory())!.FullName; var sharedConfigPath = Path.Combine(solutionRootDir, "你的公共项目文件夹名", "appsettings.json"); builder.Configuration.AddJsonFile(sharedConfigPath, optional: false, reloadOnChange: true); ConfigurationManager configuration = builder.Configuration;
注意事项
- 公共项目只建议存放多项目通用的配置,比如统一的日志配置、公共组件参数,主项目独有的配置(比如本地数据库连接字符串、服务端口、专属业务参数)仍然保留在主项目自己的appsettings.json中,避免配置耦合
- 发布部署前需要检查发布输出目录,确认共享配置文件已经被正确拷贝,避免线上启动时找不到配置
- 如果配置文件设置了「不复制」属性,无论怎么修改加载代码都无法在运行目录找到对应文件,这是最容易踩的坑
内容的提问来源于stack exchange,提问作者Stefan Bonciu
相关产品推荐
相关产品推荐

