Appsettings.Development.json не отображается проблемой конфигурации консольного приложения .net core 3.1

В моем консольном приложении 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();
    }

Кто-нибудь может помочь с этим? Файлы правильно копируются в корзину

попробуйте .AddJsonFile("appsettings.Development.json", необязательно: true, reloadOnChange: true)

Nonik 18.12.2020 00:13

я пробовал это, но все равно, получает значения из appsettings.json

Piotr P 18.12.2020 08:00

Кто-нибудь может помочь?

Piotr P 19.12.2020 21:08

Если вы хотите использовать appsettings.Development.json, а не appsettings.json, почему бы не использовать builder.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.Development.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables();

Yiyi You 23.12.2020 07:47

@YiyiYou, это тоже не сработает, настройки по-прежнему берутся из appsettings.json, даже если я не укажу для него путь.

Piotr P 26.12.2020 23:21

Вы когда-нибудь находили решение этой проблемы? Я столкнулся с точно такой же проблемой

yush 12.03.2022 06:06

Вам больше не нужна часть addjsonfile. Хостбилдер сделает это за вас. learn.microsoft.com/en-us/aspnet/core/fundamentals/host/…

Enrico 20.12.2022 14:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
7
4 568
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я нашел это на 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();
            }
        }

И куда именно идет этот код? Вы можете быть более конкретным?

Dbloom 21.12.2020 21:48

Теперь, когда я снова смотрю на исходный пост, ConfigurationBuilder настроен, но не используется. Затем хост создается без конфигурации. Я думаю, что у меня была другая проблема, чем у ОП.

Sean Howard 22.12.2020 22:17

@SeanHoward спасибо за информацию, но, как я уже сказал, я пытался даже жестко закодировать его как .AddJsonFile("appsettings.Development.json", необязательно: true), и он не думал, что это переменная среды, которая является проблемой.

Piotr P 26.12.2020 23:22

Как я уже сказал, вы вызвали .AddJsonFile в компоновщике, но передали хост в ActivatorUtilities.CreateInstance<StartService>. Застройщика может и не быть.

Sean Howard 06.01.2021 19:13

У меня была такая же проблема с моим консольным приложением с поставщиками конфигурации по умолчанию. И причина была в неправильной переменной Environment, как на вашем скриншоте - ASPNETCORE_ENVIRONMENT. И я исправил это, заменив его на DOTNET_ENVIRONMENT:

Я должен сказать, что я ошеломлен! ЭТО УЖАСНО!! Я унаследовал проект консольного приложения, которое никогда не работало должным образом, и теперь я знаю, что одна из причин заключалась в том, что в нем был определен ASPNETCORE_ENVIRONMENT вместо DOTNET_ENVIRONMENT. Большое спасибо за то, что поделились этим.

Vida 08.07.2022 17:18
Ответ принят как подходящий

Для .Net 6.0

Добавьте переменную среды DOTNET_ENVIRONMENT=Development.

Перезапустите Visual Studio 2022.

Вам не нужно устанавливать это в свойствах системы. Вы можете сделать это в Visual Studio в качестве профиля запуска.

Enrico 20.12.2022 14:40

что сработало для меня, так это установить 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. С помощью этого метода, похоже, используются настройки приложения из вызывающего приложения.

George Fabish 06.12.2022 22:02

В .NET 5 и выше этот параметр называется DOTNET_ENVIRONMENT.

В вашем launchprofile.json вы должны увидеть что-то вроде этого

  "environmentVariables": {
    "DOTNET_ENVIRONMENT": "Development"
  }

Вам больше не нужен этот кусок кода

 .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
 .AddJsonFile("appsettings.Development.json", optional: true)

хостбилдер сделает это за вас.

Другие вопросы по теме