我将WebJobs项目迁移到3.0,我遇到了一个特殊的问题。我的项目有一个appsettings.json和各种appsettings.environment.json文件。
在任何环境下运行时,而不是环境设置覆盖基本设置时,会发生反向:当使用基本设置和环境设置中的任何设置时,都会使用基本设置。
我已经尝试了使用HostBuilder.ConfigureAppConfiguration()
和HostBuilder.ConfigureHostConfiguration()
的变体,在每种情况下,我都会注意到hostInstance.Configuration.Providers
时的某些内容:JsonConfigurationProvider
总有三个实例,在配置主机或作为MAIM的一部分时,有两个内部的ChainedConfigurationProvider
中的两个实例使用应用程序时提供商数组。第一个实例始终是我的基础,第二个始终是环境,第三个始终是基础。
所以我相信我的问题是添加了第三个jsonconfigurationprovider,但我不知道它是如何添加的。
这是我的WebJob的相关代码:
var envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
?? Environment.GetEnvironmentVariable("ENV")
?? "development";
var builder = new HostBuilder()
.UseEnvironment(envName)
.ConfigureAppConfiguration(b =>
{
b.SetBasePath(Environment.CurrentDirectory)
.AddCommandLine(args, StartupSettings.SwitchMapping)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{envName}.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
});
builder.ConfigureWebJobs((context, b) =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
b.AddTimers();
});
builder.ConfigureLogging((context, b) =>
{
if (false && context.HostingEnvironment.IsDevelopment())
{
b.SetMinimumLevel(LogLevel.Debug);
}
else
{
b.SetMinimumLevel(LogLevel.Information);
b.AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Warning);
}
b.AddConsole();
var applicationInsightsKey = context.Configuration.GetValue<string>("ApplicationInsights:InstrumentationKey");
b.AddApplicationInsights(o => o.InstrumentationKey = applicationInsightsKey);
})
.UseConsoleLifetime();
builder.ConfigureServices((context, services) =>
{
/*...*/
});
return builder.Build();
只是弄清楚了。
ConfigureWebJobs()
调用ConfigureAppConfiguration()
的扩展方法并自动添加AppSetting。由于我在调用ConfigureAppConfiguration()
之后打电话给它,这是最后一个 appsettings.json 是基本的原因。
webjobshostbuilderextensions.configurewebjobs的代码:
builder.ConfigureAppConfiguration(config =>
{
config.AddJsonFile("appsettings.json", optional: true);
config.AddEnvironmentVariables();
});
最糟糕的部分是这些看起来如此多余。