.net Core Access appsettings.json在配置其他配置提供程序时

时间:2018-11-07 09:31:09

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

我刚开始使用.net Core 2.1,并且我编写了一个自定义ConfigurationProvider,可从一个单独的文件加载我的敏感配置。这对硬编码路径很有用,但我也希望文件的位置存储在配置中。如果在提供程序的设置过程中尝试访问appsettings配置,则值不存在。大概是因为我仍处于配置阶段。是否可以访问它们或失败,是否可以在Startup.cs而非Program.cs中添加另一个配置提供程序?

这就是我想要做的:

public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
    return WebHost.CreateDefaultBuilder(args)
                    .ConfigureLogging((hostingContext, logging) =>
                    {
                        logging.ClearProviders();
                        logging.AddConsole();
                        logging.AddFile(opts =>
                        {
                            hostingContext.Configuration.GetSection("FileLoggerOptions").Bind(opts);
                        });
                    })
                    .ConfigureAppConfiguration((hostingContext, config) =>
                    {
                        config.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath);
                        config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
                        config.AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true);
                        config.AddEncryptedFile(hostingContext.Configuration["SecureSettingsFile"], true, true);
                    })
                    .UseStartup<Startup>();
}

如您所见,我能够访问日志记录配置中的配置,但不能访问应用程序配置。我的提供者是AddEncryptedFile位,而hostingContext.Configuration["SecureSettingsFile"]应该从appsettings.json中读取值。

此阶段唯一可用的配置是环境变量,我真的不想使用这些变量,因为服务器上有大约30个网站。

我正在尝试做些什么吗?还是必须使用Environment变量或将加密的配置存储在与网站相同的位置上?

谢谢

1 个答案:

答案 0 :(得分:4)

您首先需要使用ConfigurationBuilder来阅读appsettings.json,然后使用构建器的输出来进行完整的配置。像这样:

.ConfigureAppConfiguration((hostingContext, config) =>
{
    var baseConfig = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("appsettings.json")
        .Build();
    var secureSettingsFile = baseConfig.GetValue<string>("SecureSettingsFile");

    /* ... */
    config.AddEncryptedFile(secureSettingsFile, true, true);
})