Неправильные значения appsettings, попадающие в объект ConfigurationBuilder во время отладки - PullRequest
0 голосов
/ 04 октября 2019

Я запускаю консольное приложение ядра .net, в котором размещается среда ядра aspnet. Я использую 3 различных окружения - Debug, Dev и Prod и связанные с ними файлы jset appsettings. Итак, я использую класс Startup, но даже до использования кода запуска, WebhostBuilder настроен. Из документов:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.0

Если значение для одного и того же ключа установлено одинаковыми или разными поставщиками конфигурации, последним значением, установленным для ключа, является используемое значение.

Хорошо, может быть, я не совсем понимаю, как правильные настройки попадают в объект конфигурации, но посмотрите ниже, как я добавляю корневой json-файл appsettings, а затем специфичный для среды, и это кажется на работу.
Так что самое большее, я должен иметь ДВУХ НАПРАВЛЕНИЙ appsettings и значение. Однако позже, когда объект config будет введен в одну из служб в моем классе Startup, значение, которое я пытаюсьвытащить из объекта конфигурации не существует. Поскольку моей переменной среды является Debug, она должна считывать значение из файла appsettings.debug.json

в appsettings.json

-not there-

в appsettings.debug.json

"AppSettings": {
  "CustomerFilesRoot": "\\\\dev-haulops1\\d$\\BoxFiles",

Кроме того, когда я захожу в один из моих сервисов и смотрю на введенный объект конфигурации, я вижу 4 провайдера конфигурации Json? Почему 4 вместо 2? Разобравшись в них, есть два из appsettings.debug.json и appsettings.json Хм, странно. Я явно что-то упускаю.

enter image description here

В моем Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)                
                .ConfigureLogging((hostingContext, logging) =>
                {
                    logging.AddEventLog();
                })
                .ConfigureAppConfiguration((context, config) =>
                {

                    // Configure the app here.
                    var env = context.HostingEnvironment;
                    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                                      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

                })
                .UseStartup<Startup>();

Начало Startup.cs

public IConfiguration Configuration { get; }
public IHostingEnvironment HostingEnvironment { get; }

public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
    Configuration = configuration;
    HostingEnvironment = environment;
}

[обновление] Не уверен, что если кто-то заметил, я использую WebHost, а не Generic Host, так что, как и в случае с веб-приложением, нет никакой явной необходимости «добавлять» файлы настроек приложения. Например, в веб-приложении у меня есть. Итак, я все еще ломаю голову над тем, почему в консольном приложении, которое, как оказалось, использует среду выполнения aspcore и использует WebHost, не пытается использовать файл (по крайней мере, для меня), связанный со средой var, установленной в launchsettings.jsonфайл. Когда я убираю явную загрузку двух файлов appsettings, я загружаю их как провайдеров конфигурации во время отладки и вижу два (в отличие от 4, упомянутых ранее). Проблема в том, что когда я иду извлечь значение из объекта конфигурации, он дает мне значение из файла, который не соответствует среде var.

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Ответы [ 3 ]

1 голос
/ 04 октября 2019

Вы не показывали эту часть, поэтому я не уверен, что вы делаете это. Но убедитесь, что вы устанавливаете переменную окружения ASPNETCORE_ENVIRONMENT.

Поскольку вы используете имена окружений, отличающиеся от трех условных названий (Development, Staging и Production), выВам нужно будет явно указать имя среды. Есть несколько способов сделать это. Как в вашем файле launchSettings.json, например:

"EnvironmentsSample": {
   "commandName": "Project",
   "launchBrowser": true,
   "applicationUrl": "https://localhost:5001;http://localhost:5000",
   "environmentVariables": {
     "ASPNETCORE_ENVIRONMENT": "Debug"
   }
}

Ссылка: Установка среды .

Но, в конечном счете, где-то вы 'Вам нужно будет определить, на каком компьютере вы в данный момент работаете, и установить переменную окружения ASPNETCORE_ENVIRONMENT на основе этой информации (например, ASPNETCORE_ENVIRONMENT=Debug).

Я думаю, что пока вы не сделаете это, IHostingEnvironment.EnvironmentName будетвести себя иначе, чем вы ожидаете.

1 голос
/ 04 октября 2019

Ну, на первый взгляд вам не хватает config И не забудьте позвонить config.AddEnvironmentVariables();, это добавит переменные env.

.ConfigureAppConfiguration((context, config) =>
            {

                // Configure the app here.
                var env = context.HostingEnvironment;
                config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                config.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
                config.AddEnvironmentVariables();
            })

И для вашей справки, конфиги из appsetting.jsonссылки в обратном порядке файлов, загруженных с использованием AddJsonFile. Другими словами, в вашем случае appsettings.{env.Environment.json} будет искать CustomerFilesRoot, если оно найдено, тогда значение будет возвращено немедленно, если нет, то appsettings.json будет искать это значение.

0 голосов
/ 05 октября 2019

Слава Господу, я нашел это. Оказывается, в конце концов, была проблема с файлом appsettings.Debug.json. Я был в главной роли прямо на это. Конфигурация все время подбирала его, но структура настроек была другой. Потом я вспомнил, что скопировал эти файлы из другого проекта.

Видите разницу? Из того, что я на самом деле читал:

  "JobSettings" {
      "SomethingHere" : "test",
      "AppSettings": {
        "setting1" : "val1"
      }
  }

То, что я ДУМАЛ, я читал:

  "JobSettings" {
      "SomethingHere" : "test",
  } ,
  "AppSettings": {
    "setting1" : "val1"
  }   

Если кто-то смотрит на эту же проблему в будущем, проверьте следующие вещи:(1) У вас установлена ​​переменная окружения, и она поднимается? установить точку останова в конструкторе автозагрузки и проверить environemnt.EnvironmentName(2) Внимательно изучите ваши файлы appsettings. У вас есть файл с соответствующим именем среды в формате appsettings. {Environment} .json? Вы пытаетесь прочитать значение, которое находится в том же месте, на которое пытается ссылаться ваш код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...