В моем консольном приложении asp.net core 3.1. В основном классе у меня есть такой код:
class Program
{
static void Main(string[] args)
{
var builder = new ConfigurationBuilder();
BuildConfig(builder);
var host = Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
services.AddTransient<StartService>();
})
.Build();
var svc = ActivatorUtilities.CreateInstance<StartService>(host.Services);
svc.Run();
}
static void BuildConfig(IConfigurationBuilder builder)
{
builder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development"}.json", optional: true)
.AddEnvironmentVariables();
}
}
Среда настроена на разработку
и такие файлы конфигурации (только значения там отличаются):
Мое приложение продолжает принимать значения из appsettings.json. Что изменить, чтобы брать значения из appsettings.Developement.json?
Я также пробовал так, но это тоже не сработало:
static void BuildConfig(IConfigurationBuilder builder)
{
builder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile("appsettings.Development.json", optional: true)
.AddEnvironmentVariables();
}
Кто-нибудь может помочь с этим? Файлы правильно копируются в корзину
я пробовал это, но все равно, получает значения из appsettings.json
Кто-нибудь может помочь?
Если вы хотите использовать appsettings.Development.json, а не appsettings.json, почему бы не использовать builder.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.Development.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables();
@YiyiYou, это тоже не сработает, настройки по-прежнему берутся из appsettings.json, даже если я не укажу для него путь.
Вы когда-нибудь находили решение этой проблемы? Я столкнулся с точно такой же проблемой
Вам больше не нужна часть addjsonfile. Хостбилдер сделает это за вас. learn.microsoft.com/en-us/aspnet/core/fundamentals/host/…
Я нашел это на GitHub: https://github.com/aspnet/Hosting/issues/1440.
Я думаю, проблема в том, что ConfigurationBuilder не читает параметры запуска. Я добавил следующее, чтобы исправить это.
static async Task Main(string[] args)
{
var builder = new HostBuilder();
builder
.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
//b.AddAzureStorage();
b.AddTimers();
})
.ConfigureHostConfiguration(configHost =>
{
configHost.AddEnvironmentVariables(prefix: "ASPNETCORE_");
configHost.AddCommandLine(args);
})
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
})
.ConfigureLogging((context, b) =>
{
b.AddConsole();
});
var host = builder.Build();
using (host)
{
// The following code ensures that the WebJob will be running continuously
await host.RunAsync();
}
}
И куда именно идет этот код? Вы можете быть более конкретным?
Теперь, когда я снова смотрю на исходный пост, ConfigurationBuilder настроен, но не используется. Затем хост создается без конфигурации. Я думаю, что у меня была другая проблема, чем у ОП.
@SeanHoward спасибо за информацию, но, как я уже сказал, я пытался даже жестко закодировать его как .AddJsonFile("appsettings.Development.json", необязательно: true), и он не думал, что это переменная среды, которая является проблемой.
Как я уже сказал, вы вызвали .AddJsonFile в компоновщике, но передали хост в ActivatorUtilities.CreateInstance<StartService>. Застройщика может и не быть.
У меня была такая же проблема с моим консольным приложением с поставщиками конфигурации по умолчанию. И причина была в неправильной переменной Environment, как на вашем скриншоте - ASPNETCORE_ENVIRONMENT. И я исправил это, заменив его на DOTNET_ENVIRONMENT:
Я должен сказать, что я ошеломлен! ЭТО УЖАСНО!! Я унаследовал проект консольного приложения, которое никогда не работало должным образом, и теперь я знаю, что одна из причин заключалась в том, что в нем был определен ASPNETCORE_ENVIRONMENT вместо DOTNET_ENVIRONMENT. Большое спасибо за то, что поделились этим.
Для .Net 6.0
Добавьте переменную среды DOTNET_ENVIRONMENT=Development.
Перезапустите Visual Studio 2022.
Вам не нужно устанавливать это в свойствах системы. Вы можете сделать это в Visual Studio в качестве профиля запуска.
что сработало для меня, так это установить Copy to Output Directory
на Copy if newer
.NET 3.1 — приложение WPF
Я просто хотел подтвердить, что переменная DOTNET_ENVIRONMENT работала и для меня, но хотел добавить, что в Visual Studio 2022 в моем консольном приложении .Net 6 мне пришлось настроить значение в профилях запуска, к которым я перешел через раздел отладки в Свойства проекта:
Мне также НЕ нужно было добавлять файл appsettings.Develepment.json в сборщик, когда я тестировал это.
Все, что у меня есть в моем Program.cs для настройки внедрения зависимостей, это:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
Console.WriteLine("Starting...");
using var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((_, services) =>
{
services.AddTransient<ISqlServerTests, SqlServerTests>();
})
.Build();
Console.WriteLine("Done");
На заметку, здесь может быть некоторая странность, если вы пытаетесь запустить консольное приложение из основного приложения ASP .NET. С помощью этого метода, похоже, используются настройки приложения из вызывающего приложения.
В .NET 5 и выше этот параметр называется DOTNET_ENVIRONMENT.
В вашем launchprofile.json вы должны увидеть что-то вроде этого
"environmentVariables": {
"DOTNET_ENVIRONMENT": "Development"
}
Вам больше не нужен этот кусок кода
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile("appsettings.Development.json", optional: true)
хостбилдер сделает это за вас.
попробуйте .AddJsonFile("appsettings.Development.json", необязательно: true, reloadOnChange: true)