在aspnetcore 2.0项目中,我正在尝试在整个Web应用程序和几个xunit测试项目中设置一个共享的appsettings.json文件。
首先,当我将appsettings.json“定期”添加到我的项目中时,一切正常。但是,当我尝试从其他路径添加单个引用/链接文件时,在运行时不会读取这些值。
要进行此设置,我为每个项目将链接文件添加到.csproj:
<ItemGroup>
<Content Include="..\Shared\appsettings.json">
<Link>appsettings.json</Link>
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
在每个构建中,我可以验证它是否输出到/bin/Debug/netcoreapp2.0
目录:
问题在于,当通过我的webapi的默认启动或在测试中读取它时,设置值始终为null。我正在使用强类型配置。在webapi项目中,我正在使用带有aspnetcore 2.0约定的WebHost.CreateDefaultBuilder()(引人注目的是hostingEnvironment.EnvironmentName
,dotPeek告诉我)。
但是在测试项目的情况下,同样的情况也会发生。所有这些都可以通过我的全局测试夹具中的以下示例来解释:
var builder = new ConfigurationBuilder()
// .SetBasePath(???)
.AddJsonFile("appsettings.json");
var configuration = builder.Build();
var settings = new FooSettings();
configuration.GetSection("FooSettings").Bind(settings);
if (settings == null) throw new Exception("Could not find or parse 'appsettings.json'");
// The problem: always fails on this check
if (string.IsNullOrEmpty(settings.Bar)) throw new Exception("Could not find or parse 'FooSettings'");
问题在上面示例的最后一行中发表了评论。再次,当我直接将appsettings.json文件添加到项目根目录时,它完美地工作,而不是将其添加为共享文件夹的链接引用。我假设我必须以不同方式更改.csproj配置或使用不同的.SetBasePath(???)
。但对于两者而言,我都在努力实现它。
问题:如何在所有项目中正确阅读链接 appsettings文件?
N.B。我发现了其他几个帖子,但找不到任何匹配的答案,特别是dotnetcore。
答案 0 :(得分:0)
我在 Program
中添加了一些代码后它开始工作(感谢@mr_squall 的指导..):
public static void Main(string[] args)
{
CreateHostBuilder(args)
#if !DEBUG
.UseContentRoot(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location))
#endif
.Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});