无法读取dotnet核心中链接的appsettings.json文件的值

时间:2018-04-17 21:55:03

标签: c# asp.net-core .net-core appsettings

在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目录:

Screenshot of output directory

问题在于,当通过我的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。

1 个答案:

答案 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>();
                });