尝试设置配置值“IHostBuilder”,但未反映在启动类中的ConfigureServices - asp.net core 3.1

use*_*018 4 c# asp.net-core-3.1

我有以下带有空连接字符串的配置,

"ConnString": {
"Value":  "" 
},
Run Code Online (Sandbox Code Playgroud)

现在在 Asp.Net Core 3.1 应用程序中,我尝试在其中设置连接字符串值CreateHostBuilder

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureAppConfiguration((context, config) =>
                {
                    var settings = config.Build();
                    settings["ConnString:Value"] = "MY CONNECTION STRING";

                });

                webBuilder.UseStartup<Startup>();
            });
Run Code Online (Sandbox Code Playgroud)

但这个值并没有反映在类ConfigureServices的方法中Startup,它仍然显示为空。我需要在这里做什么?请建议!

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
    {
        var updateValue = Configuration.GetSection("ConnString:Value").Value;
    }
Run Code Online (Sandbox Code Playgroud)

pin*_*x33 6

您正在构建配置并在 IConfiguration对象上设置值。但是,由于您没有在builder上设置值,这些设置将会丢失。底层基础设施稍后再次调用Build ,这会创建另一个新的 IConfiguration. 这些值不会神奇地转移。

您可以做的就是调用AddInMemoryCollection并传递您的新设置。然后,这将被基础设施消耗并稍后提供(即在 中ConfigureServices):

webBuilder.ConfigureAppConfiguration((context, config) =>
{
   config.AddInMemoryCollection(
     new [] { 
       new KeyValuePair<string, string>("ConnString:Value", "MY CONNECTION STRING") 
     }
   );
});
Run Code Online (Sandbox Code Playgroud)

IWebHostBuilder还有一种UseSetting可以配置单个设置的方法。这会添加一个新的内存配置提供程序,其中仅包含一个值:

webBuilder.UseSetting("ConnString:Value", "MY CONNECTION STRING");
Run Code Online (Sandbox Code Playgroud)

请注意,IWebHostBuilder将使用(通用主机)的配置IHostBuilder。您也可以调用ConfigureAppConfiguration主机构建器。

Host.CreateDefaultBuilder(args) 
    .ConfigureAppConfiguration((context, config) =>
     {
        config.AddInMemoryCollection(
          new [] { 
            new KeyValuePair<string, string>("ConnString:Value", "MY CONNECTION STRING") 
          }
        );
     });
Run Code Online (Sandbox Code Playgroud)

如果您有用于配置其他设置的设置,则此“注入”特别有用。您可以将它们添加到ConfigureHostConfiguration(对于 不存在),从而允许它们的值在任一构建器IWebHostBuilder可用。 ConfigureAppConfiguration

请注意,配置不会共享主机构建器。您添加到 Web 主机的任何配置都不会自动应用于通用主机。ServiceCollection我之所以这么说,是因为它与两者之间共享的行为不同(向其中一个添加服务会添加到另一个)。

根据您的评论更新:

我上面提到过,ConfigureHostConfiguration如果您有用于配置/设置其他配置提供程序的设置,则可以使用它。这对于配置 Azure KeyVault 等操作特别有用。

Host.CreateDefaultBuilder(args) 
    .ConfigureHostConfiguration(config =>
     {
        // setup bootstrapping settings. For example if we need to add in values used
        // to configure azure key vault stored in app settings and maybe some in memory 
        config.AddJsonFile("appsettings.json");
        config.AddInMemoryCollection(
          new [] { 
            new KeyValuePair<string, string>("ClientId", "AzureClientId"), 
            new KeyValuePair<string, string>("TenantId", "AzureTenantId") 
          }
        );
     })
     // settings added in ConfigureHostConfiguration are now available via context.Configuration
    .ConfigureAppConfiguration((context, config) =>
     {
         // use the values we added during bootstrapping 
         var tenant = context.Configuration["TenantId"];
         var client = context.Configuration["ClientId"];
         // example, I don't remember the parameters off-hand
         config.AddAzureKeyVault(tenant, client, /*etc*/);
     });
Run Code Online (Sandbox Code Playgroud)

在这个例子中ConfigureAppConfiguration也可以调用 onIWebHostBuilder来代替。

有关配置和通用主机的更多信息,请参阅 文档