在 .NET 4.7.1 中,可以使用另一个选项:使用 ConfigurationBuilder。
这个想法是自定义类有机会在将 web.config 中包含的值传递给应用程序之前对其进行操作。这允许插入其他配置系统。
例如:使用与 ASP.NET Core 类似的配置方法,它包含的 NuGet 包可以在 .NET Framework 上独立使用,也可以加载 json 和覆盖 json 文件。然后可以使用环境变量(或任何其他值,如 IIS 应用程序池 ID、机器名称等)来确定要使用的覆盖 json 文件。
例如:如果有一个appsettings.json 类似的文件
{
"appSettings": { "Foo": "FooValue", "Bar": "BarValue" }
}
和一个appsettings.Production.json 文件包含
{
"appSettings": { "Foo": "ProductionFooValue" }
}
可以写一个像这样的配置构建器
public class AppSettingsConfigurationBuilder : ConfigurationBuilder
{
public override ConfigurationSection ProcessConfigurationSection(ConfigurationSection configSection)
{
if(configSection is AppSettingsSection appSettingsSection)
{
var appSettings = appSettingsSection.Settings;
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";
var appConfig = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile($"appsettings.{environmentName}.json", optional: true)
.Build();
appSettings.Add("Foo", appConfig["appSettings:Foo"]);
appSettings.Add("Bar", appConfig["appSettings:Bar"]);
}
return configSection;
}
}
然后在Web.config 中连接配置生成器:
<configSections>
<section name="configBuilders" type="System.Configuration.ConfigurationBuildersSection, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" restartOnExternalChanges="false" requirePermission="false"/>
</configSections>
<configBuilders>
<builders>
<add name="AppSettingsConfigurationBuilder" type="My.Project.AppSettingsConfigurationBuilder, My.Project"/>
</builders>
</configBuilders>
<appSettings configBuilders="AppSettingsConfigurationBuilder" />
如果您随后在开发机器上将 ASPNETCORE_ENVIRONMENT(仅选择名称,以便同一服务器上的 ASP.NET Core 应用程序使用相同的默认值)环境变量设置为 Development,ConfigurationManager.AppSettings["Foo"] 将看到 @987654334 @ 而不是 FooProductionValue。
您还可以使用APP_POOL_ID 对环境名称进行硬编码,或使用IIS 10 功能对set environment variables on app pools 进行编码。这样,您可以真正构建一次并将相同的输出复制到不同的服务器,甚至复制到同一服务器上的多个目录,并且仍然为不同的服务器使用不同的配置。