ASP.NET Core 2.0无法读取共享链接的appsettings.json文件值
解决ASP.NET Core 2.0中共享appsettings.json给Web和xUnit测试项目的问题
我之前也遇到过一模一样的问题!用链接文件的时候看着项目里明明显示有这个文件,但运行起来就是读不到配置值,其实核心原因是链接文件并没有被复制到项目的输出目录,程序运行时在当前工作目录找不到它。下面是我亲测有效的解决步骤:
1. 先整理共享配置的目录结构
在你的解决方案根目录下新建一个专门存放共享配置的文件夹,比如叫SharedConfig,把共用的appsettings.json(以及对应的环境配置文件,比如appsettings.Development.json)都放在这个文件夹里。
2. 给每个项目添加链接文件并配置复制规则
打开Web项目和每个xUnit测试项目的.csproj文件,添加以下配置节点(注意根据你的项目目录层级调整Include里的相对路径):
<ItemGroup> <!-- 共享主配置文件 --> <Content Include="..\SharedConfig\appsettings.json"> <Link>appsettings.json</Link> <!-- 关键:编译时将文件复制到输出目录,保留最新版本 --> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <!-- 如果有环境专属配置,同样配置 --> <Content Include="..\SharedConfig\appsettings.Development.json"> <Link>appsettings.Development.json</Link> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
这里的<CopyToOutputDirectory>是关键,它会让编译过程把共享目录里的配置文件复制到每个项目的bin/Debug/netcoreapp2.0(或对应版本)目录下,这样程序运行时就能找到文件了。
3. 配置xUnit测试项目的加载逻辑
Web项目会自动加载根目录的配置文件,但xUnit测试项目需要手动构建配置对象。在你的测试类里添加初始化逻辑:
private readonly IConfiguration _configuration; public YourTestClass() { var configBuilder = new ConfigurationBuilder() // 设置当前工作目录为测试项目的输出目录 .SetBasePath(Directory.GetCurrentDirectory()) // 加载共享的配置文件,optional设为false确保文件不存在时直接报错 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) // 如果需要加载环境配置,加上这一行 .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true); _configuration = configBuilder.Build(); }
之后你就可以在测试方法里通过_configuration["YourConfigKey"]读取配置值了。
额外注意点
- 确认相对路径正确:如果你的项目放在
src/WebApp、tests/UnitTests这类子目录里,Include里的路径要对应调整为..\..\SharedConfig\appsettings.json这种层级。 - 如果用依赖注入管理测试服务,可以在测试初始化时把
IConfiguration注册到服务容器里,方便在测试类中注入使用。
内容的提问来源于stack exchange,提问作者Juliën
相关产品推荐
相关产品推荐

