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)
您正在构建配置并在新 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来代替。
| 归档时间: |
|
| 查看次数: |
4289 次 |
| 最近记录: |