尝试设置配置值“IHostBuilder”,但未反映在 Startup class - asp.net core 3.1 中的 ConfigureServices
trying to set config value `IHostBuilder` but not reflected for ConfigureServices in Startup class - asp.net core 3.1
我有以下配置,连接字符串为空,
"ConnString": {
"Value": ""
},
现在在 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>();
});
但是这个值没有反映在 Startup
class 的 ConfigureServices
方法中,它仍然显示为空。我需要在这里做什么?请建议!
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;
}
您正在构建配置并在 new IConfiguration
对象上设置值。然而,这些设置将会丢失,因为您没有在 builder 上设置值。底层基础设施稍后再次调用 Build,创建另一个 new IConfiguration
。这些值不会神奇地转移过来。
您可以改为调用 AddInMemoryCollection
并在那里传递您的新设置。这将被基础设施消耗并稍后可用(即在 ConfigureServices
中):
webBuilder.ConfigureAppConfiguration((context, config) =>
{
config.AddInMemoryCollection(
new [] {
new KeyValuePair<string, string>("ConnString:Value", "MY CONNECTION STRING")
}
);
});
IWebHostBuilder
也有一个 UseSetting
方法,您可以在其中配置 单个 设置。这将添加一个仅包含一个值的新内存中配置提供程序:
webBuilder.UseSetting("ConnString:Value", "MY CONNECTION STRING");
请注意,IWebHostBuilder
将使用来自 IHostBuilder
(通用主机)的配置。您也可以在主机构建器上调用 ConfigureAppConfiguration
。
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
config.AddInMemoryCollection(
new [] {
new KeyValuePair<string, string>("ConnString:Value", "MY CONNECTION STRING")
}
);
});
如果您有用于配置 其他 设置的设置,此“注入”特别有用。您可以改为将它们添加到 ConfigureHostConfiguration
(对于 IWebHostBuilder
不存在),从而允许它们的值在 ConfigureAppConfiguration
中在任一构建器上可用。
请注意,配置不会返回 共享给主机构建器。您添加到虚拟主机的任何配置都不会自动应用于通用主机。我之所以这样说,是因为它不同于两者共享的 ServiceCollection
的行为(将服务添加到另一个)。
根据您的评论更新:
我在上面提到,如果您有用于 configure/setup 其他配置提供程序的设置,则可以使用 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*/);
});
在此示例中,也可以在 IWebHostBuilder
上调用 ConfigureAppConfiguration
。
有关配置和通用主机的更多信息,see the documentation。
我有以下配置,连接字符串为空,
"ConnString": {
"Value": ""
},
现在在 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>();
});
但是这个值没有反映在 Startup
class 的 ConfigureServices
方法中,它仍然显示为空。我需要在这里做什么?请建议!
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;
}
您正在构建配置并在 new IConfiguration
对象上设置值。然而,这些设置将会丢失,因为您没有在 builder 上设置值。底层基础设施稍后再次调用 Build,创建另一个 new IConfiguration
。这些值不会神奇地转移过来。
您可以改为调用 AddInMemoryCollection
并在那里传递您的新设置。这将被基础设施消耗并稍后可用(即在 ConfigureServices
中):
webBuilder.ConfigureAppConfiguration((context, config) =>
{
config.AddInMemoryCollection(
new [] {
new KeyValuePair<string, string>("ConnString:Value", "MY CONNECTION STRING")
}
);
});
IWebHostBuilder
也有一个 UseSetting
方法,您可以在其中配置 单个 设置。这将添加一个仅包含一个值的新内存中配置提供程序:
webBuilder.UseSetting("ConnString:Value", "MY CONNECTION STRING");
请注意,IWebHostBuilder
将使用来自 IHostBuilder
(通用主机)的配置。您也可以在主机构建器上调用 ConfigureAppConfiguration
。
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
config.AddInMemoryCollection(
new [] {
new KeyValuePair<string, string>("ConnString:Value", "MY CONNECTION STRING")
}
);
});
如果您有用于配置 其他 设置的设置,此“注入”特别有用。您可以改为将它们添加到 ConfigureHostConfiguration
(对于 IWebHostBuilder
不存在),从而允许它们的值在 ConfigureAppConfiguration
中在任一构建器上可用。
请注意,配置不会返回 共享给主机构建器。您添加到虚拟主机的任何配置都不会自动应用于通用主机。我之所以这样说,是因为它不同于两者共享的 ServiceCollection
的行为(将服务添加到另一个)。
根据您的评论更新:
我在上面提到,如果您有用于 configure/setup 其他配置提供程序的设置,则可以使用 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*/);
});
在此示例中,也可以在 IWebHostBuilder
上调用 ConfigureAppConfiguration
。
有关配置和通用主机的更多信息,see the documentation。