Как обновить appsettings.json на основе профиля публикации с помощью .NET Core?

В настоящее время я перехожу с .NET Framework на .NET Core. Раньше все настройки моего приложения находились в файле Web.config. Когда я добавил новый профиль публикации, я мог щелкнуть правой кнопкой мыши и выбрать «Добавить преобразование конфигурации», что приведет к созданию вложенного файла Web. {Profile} .config в Web.config, где я мог бы установить параметры приложения, специфичные для соответствующего профиля.

Теперь в .NET Core я хочу добиться того же эффекта, используя файл appsettings.json вместо файла Web.config. Как я могу создать файл appsettings. {Profile} .json, который будет вложен в мой файл appsettings.json и содержать настройки, относящиеся к моему профилю публикации? Конечно, я могу создать файл вручную, но что «связывает» настройки, чтобы они переопределяли appsettings.json при публикации приложения? Есть ли простой способ сделать это в Visual Studio, как я описал для своих старых проектов .NET Framework? Или я что-то упускаю?

Спасибо!

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
13
0
13 107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

but what is it that 'links' the settings so that they will override appsettings.json when the application is published?

Настройки приложения настраиваются WebHost в Program.cs.

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

В реализации webhost.cs фреймворк добавляет настройки приложения на веб-хост:

config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

Во второй строке добавляется специфичный для среды appsettings. В Visual Studio эта переменная среды определена на странице Project Settings -> Debug и называется ASPNETCORE_ENVIRONMENT. По умолчанию он установлен на Development, поэтому при сборке и запуске в Visual Studio файл appsettings.development.json (если он существует) будет загружен и переопределит любые соответствующие параметры в файле appsettings.json.

При публикации приложения вы можете переопределить это значение с помощью одноименной переменной среды ОС. Существует иерархия, в которой .NET Core считывает значения и имеет политику «побеждает последний».

В настоящее время иерархия:

  1. Files (appsettings.json, appsettings.{Environment}.json, where {Environment} is the app's current hosting environment)
  2. Azure Key Vault
  3. User secrets (Secret Manager) (in the Development environment only)
  4. Environment variables
  5. Command-line arguments

Поэтому, когда вы публикуете свое приложение, вы можете переопределить среду в ОС хоста с помощью переменной среды. Когда .NET Core запускает ваше опубликованное приложение, оно считывает эти переменные и загружает соответствующий файл appsettings. {Environment} .json. ЕСЛИ значение не задано или файл для этой среды не существует, будут применяться настройки appsettings.json.

Вы можете прочитать больше о настройке ASPNETCORE_ENVIROMENTздесь

Это замечательно, и я считаю, что это правильно, но на самом деле не отвечает на вопрос, как заменить преобразования web.config. Что, если мой разработчик и несколько тестовых сред существуют на одном компьютере? Как создать уникальную переменную среды уровня ОС для каждого ХОСТА? Мне бы очень хотелось, чтобы реальное решение по преобразованию работало во время сборки (или публикации), а не во время выполнения.

iGanja 24.04.2019 21:10

Приложения .Net Core создаются после запуска где угодно, поэтому преобразование web.config больше не рекомендуется. См. Хорошее описание в этот ответ. В вашей среде с несколькими хостами вы можете использовать аргументы командной строки, чтобы переопределить значение {environment} для этого экземпляра и позволить вам использовать разные настройки для разных экземпляров.

Simply Ged 26.04.2019 03:53

Тот факт, что я теоретически могу запустить свое модное новое приложение .NET Core на любой платформе, является хорошим маркетинговым приемом от Microsoft, чтобы не отставать от Джонсов, но на самом деле большинство разработчиков Microsoft знают платформу, на которой они собираются развертывать, и это скорее всего, это сервер IIS. Хотя я понимаю, что преобразования больше не «рекомендуются», мне действительно нужно решение для непрерывной интеграции, такое же простое, как преобразования web.config.

iGanja 26.04.2019 17:45

Если вы ориентируетесь только на Windows, то лучше всего придерживаться .Net Framework, поскольку он разработан исключительно для Windows и предлагает большую поверхность API для Windows. У Microsoft есть страница, который помогает вам выбрать, какой фреймворк использовать. Хотя .Net Core - это «новая блестящая игрушка», это не всегда лучший выбор :-)

Simply Ged 27.04.2019 08:13

Согласованный. Хотя я обнаружил некоторые приятные преимущества перехода на .NET Core даже в чистой среде Windows. Как вы говорите, мы теряем несколько хороших API, специфичных для Windows, но я обнаружил, что это заставляет нас вместо этого учитывать, что существуют другие платформы, и то, как программировать более агностическим способом. Это, и кажется, что всегда есть какой-нибудь Dev Manager, который чувствует необходимость быть в курсе последних [величайших], несмотря ни на что. : ^)

iGanja 29.04.2019 17:33

... и после моего первоначального комментария я с тех пор обнаружил, что преобразования web.config полностью поддерживаются VS 2017 и MS Build для .NET Core, как только вы поймете, что команды сборки вложенности и преобразования не обязательно должны быть частью проект больше не существует. Не используйте «Добавить преобразования конфигурации» в вашем web.config больше, если вы не найдете исправление, которое не повреждает файл вашего проекта. Просто вручную добавьте трансформируемые версии вашего web.config, и они будут автоматически вставляться и запускаться при публикации. Да VS 2017!

Следующее, в вашем web.Release.config очень хорошо работает для установки вашей переменной среды.

<configuration xmlns:xdt = "http://schemas.microsoft.com/XML-Document-Transform">
  <location>
    <system.webServer>
      <aspNetCore>
        <environmentVariables>
          <environmentVariable name = "ASPNETCORE_ENVIRONMENT" value = "Production" xdt:Locator = "Match(name)" xdt:Transform = "SetAttributes" />
        </environmentVariables>
      </aspNetCore>
    </system.webServer>
  </location>
</configuration>

Кроме того, с .NET Core 2.2 вам больше не нужно добавлять дополнительные преобразования настроек приложения (отключая переменную среды) в свой класс Startup. По умолчанию ...

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

... автоматически обрабатывает принятый код ответа.

Суть в том, что как непримиримый разработчик Microsoft я все еще хочу предполагать, что мое приложение будет опубликовано только на сервере IIS с использованием MS Build и Web Deploy, и я хотел бы иметь возможность настраивать свое приложение с помощью собственной конфигурации приложения. ; и я хочу иметь возможность делать это в сборке, а не с помощью команды командной строки публикации или пост-публикации. Если Microsoft или кто-то создаст простой плагин сборки для Visual Studio, который преобразует мой файл appsettings.json, поэтому я публикую только то, что необходимо для данной среды, я с радостью воспользуюсь им, но я его не нашел или у меня был время написать еще.

И именно поэтому я обязательно отвечаю на вопрос OP напрямую: AppSettings можно легко перенести из web.config в appsettings.json и, вероятно, должен, если вы понимаете, что ВСЕ файлы appsettings.json опубликованы и определены при запуске -time, в отличие от настоящего решения преобразования, в котором публикуются только необходимые файлы и настройки на основе запрошенного профиля. Использование преобразования web.config только для установки переменной среды, необходимой для определения того, какой файл appsettings. {Env} .json использовать. Опять же, все это обсуждение идет по пути Додо, если мы можем преобразовать наш файл apsettings.json так же, как наш web.config, как запросил OP. У меня такое чувство, что когда-нибудь это произойдет, если еще не было.

Да, переход от устаревшей .NET Framework к .NET Core может быть забавным занятием. .NET Core - это огромный шаг вперед, но есть несколько препятствий, которые необходимо преодолеть; особенно для тех, кто был на наследии с самого начала.

@Toolkit - возможно. Для VS существует плагин преобразования, который преобразует любой (другой) файл на основе xml, например app.config. Это называется «Преобразование конфигурации» Голана Авраама marketplace.visualstudio.com/….

iGanja 10.08.2019 01:41

Вот интересная статья от MS 2020 года об использовании Web.config с Core 3.1: docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis/…

Roberto 12.10.2020 13:40

Вот уродливый обходной путь:

В конвейере сборки Azure после сборки основного проекта ASP.NET скопируйте файл appsettings.Production.json в отдельную папку в папке артефактов. В конвейере выпуска используйте задачу «Заменить токены», чтобы заменить токены в этом json-файле переменными выпуска. После развертывания приложения в IIS скопируйте «преобразованный» appsettings.Production.json в папку веб-сайта.

Оно работает...

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