配置
当IWebHostBuilder
对象被创建的时候,它会将当前的环境变量作为配置源来创建承载最初配置数据的IConfiguration
对象,但它只会选择名称以ASPNETCORE_
为前缀的环境变量。
1. 读取和修改键值对配置
IConfiguration
对象是以字典的结构来存储配置数据的,该接口定义的索引可供我们以键值对的形式来读取和修改配置数据。在ASP.Net应用中,我们可以通过调用定义在IWebHostBuilder
接口的GetSetting
方法和UseSetting
方法达到相同的目的。
public static void Main(string[] args)
{
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(builder => builder
.UseSetting("RedisHelper:ConnectionString", "connection_string")
.UseSetting("RedisHelper:DbNumber", "0")
.UseStartup<Startup>())
.Build()
.Run();
}
ASP.Net 框架自身的很多特性也都可以通过配置进行定制。例如,ASP.Net应用的服务器默认使用launchSettings.json
文件定义的监听地址,但是我们可以通过修改配置采用其它的监听地址。
如果希望通过修改配置来控制ASP.Net框架的某些行为,就需要先知道对应的配置项的名称是什么。如端口和监听地址是通过名称为urls
的配置项来控制的,如果记不住这个配置项的名称,也可以直接使用定义在WebHostDefaults
中对应的只读属性ServerUrlsKey
,该静态类型中还提供了其它一些预定义的配置项名称。
public static void Main(string[] args)
{
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(builder => builder
// .UseSetting(WebHostDefaults.ServerUrlsKey, "http://0.0.0.0:8888")
.UseUrls("http://0.0.0.0:8888")
.UseStartup<Startup>())
.Build()
.Run();
}
除了调用UseSetting
方法设置urls
配置项来修改服务器的监听地址,直接调用IWebHostBuilder
接口的UseUrls
扩展方法也可以达到相同的目的。
2. 合并配置
在启动一个 ASP.Net应用时,我们可以自行创建一个承载配置的IConfiguration
对象,并通过调用IWebHostBuilder
接口的UseConfiguration
扩展方法将它与应用自身的配置进行合并。如果应用自身存在重复的配置项,那么该配置项的值会被指定的IConfiguration
对象覆盖。
public static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.AddInMemoryCollection(new Dictionary<string, string>
{
["Foobar:Foo"] = "Foo",
["Foobar:Bar"] = "Bar"
}).Build();
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(builder => builder
.UseConfiguration(configuration)
.UseStartup<Startup>())
.Build()
.Run();
}
3. 注册IConfigurationSource
配置系统最大的特点是可以注册不同的配置源。借助IWebHostBuilder接口的UseConfiguration扩展方法,虽然可以将利用配置系统提供的IConfiguration对象应用到ASP.Net程序中,但是这样的整合方式总显得不够彻底,更加理想的方式应该是可以直接在 ASP.Net 应用中注册IConfigurationSource。
针对 IConfigurationSource的注册可以调用 IWebHostBuilder接口的ConfigureAppConfiguration方法来完成,该方法与在 IHostBuilder 接口上定义的同名方法基本上是等效的。
public static void Main(string[] args)
{
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(builder => builder
.ConfigureAppConfiguration(configuration => configuration.AddInMemoryCollection(
new Dictionary<string, string>
{
["Foobar:Foo"] = "Foo",
["Foobar:Bar"] = "Bar"
}))
.UseStartup<Startup>())
.Build()
.Run();
}