Я мигрирую проект WebJobs на 3.0, и у меня возникла странная проблема. В моем проекте есть appsettings.json и различные файлы appsettings.environment.json.
При работе в любой среде вместо настроек среды, переопределяющих базовые настройки, происходит обратное: если в базовых настройках и настройках среды существуют какие-либо настройки, используются базовые настройки.
Я пробовал варианты использования HostBuilder.ConfigureAppConfiguration()
и HostBuilder.ConfigureHostConfiguration()
, и в каждом случае я замечаю что-то своеобразное, когда смотрю на hostInstance.Configuration.Providers
: всегда есть три экземпляра JsonConfigurationProvider
с двумя из них внутри 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();