如何将项目外的JSON配置文件添加到.NET的ConfigurationBuilder中
解决方案
错误根因
你遇到的路径报错由两个问题导致:
Path.Join("..", env.ContentRootPath)参数顺序错误,相对路径参数需要放在基路径参数之后- 拼接后得到的相对路径未转换为绝对路径,
SetBasePath方法要求传入绝对路径参数
方案1:直接计算解决方案根路径(适用于目录结构固定的项目)
根据你的物理目录结构,项目存放在解决方案根目录下的/src/BaseTemplate路径下,从项目路径向上退2层即可得到解决方案根路径,代码示例如下:
// 从项目ContentRootPath向上退2层,获取解决方案根绝对路径 var solutionRoot = Path.GetFullPath(Path.Combine(env.ContentRootPath, "..", "..")); var configurationBuilder = new ConfigurationBuilder() .SetBasePath(solutionRoot) // 按实际物理路径填写配置文件位置 .AddJsonFile("settings/Development/SwaggerSettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables();
注意:如果你的项目目录层级有调整,修改
Path.Combine中..的个数即可,每加一个..就向上多退一层目录。
方案2:区分开发/生产环境适配路径
为了避免硬编码的相对路径在发布后失效,可以用预编译指令区分环境,开发环境读取解决方案下的配置,生产环境默认读取程序运行目录下的配置:
var configBasePath = env.ContentRootPath; #if DEBUG // 开发环境下才退层级找解决方案根的配置 configBasePath = Path.GetFullPath(Path.Combine(env.ContentRootPath, "..", "..")); #endif var configurationBuilder = new ConfigurationBuilder() .SetBasePath(configBasePath) .AddJsonFile("settings/Development/SwaggerSettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables();
方案3:配置MSBuild自动复制配置文件(推荐)
你可以直接在项目的.csproj文件中添加配置,让编译时自动把解决方案下的配置文件复制到输出目录,无需修改代码的路径逻辑:
<ItemGroup> <!-- 路径按实际配置文件存放位置调整,**表示匹配所有子目录 --> <None Include="..\..\settings\**\*.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
配置后代码可以直接按原逻辑写,运行时会直接读取输出目录下复制过来的配置文件,适配开发、发布所有场景。
补充优化
如果需要适配多环境配置,可以结合当前环境名称动态读取对应目录的配置:
.AddJsonFile($"settings/{env.EnvironmentName}/SwaggerSettings.json", optional: false, reloadOnChange: true)
内容的提问来源于stack exchange,提问作者M. Ozn
相关产品推荐
相关产品推荐

