как настроить ASPNETCORE_ENVIRONMENT для публикации основного приложения asp.net?

111

когда я публикую основное веб-приложение asp.net в своей локальной файловой системе, оно всегда принимает конфигурацию production и переменную ASPNETCORE_ENVIRONMENT со значением = "Production".

как и где мне установить значение переменной ASPNETCORE_ENVIRONMENT, чтобы она учитывалась не только для отладки, но и для публикации ? я уже безуспешно пробовал следующие варианты:

  • в настройках Windows
  • в файле .pubxml
  • в launchSettings.json
  • в project.json
Дарио
источник
3
Вы читаете официальные документы docs.microsoft.com/en-us/aspnet/core/fundamentals/environments или это руководство andrewlock.net/… ?
J. Doe
1
stackoverflow.com/questions/43493259/… у этого есть 2 варианта проверки реальной ошибки.
Kurkula

Ответы:

91

Помимо упомянутых выше вариантов, есть еще несколько решений.

1. Изменение файла проекта (.CsProj).

MSBuild поддерживает EnvironmentNameсвойство, которое может помочь установить правильную переменную среды в соответствии со средой, которую вы хотите развернуть. Имя среды будет добавлено в web.config на этапе публикации.

Просто откройте файл проекта (* .csProj) и добавьте следующий XML.

<!-- Custom Property Group added to add the Environment name during publish
  The EnvironmentName property is used during the publish for the Environment variable in web.config
  -->
  <PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
    <EnvironmentName>Development</EnvironmentName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
    <EnvironmentName>Production</EnvironmentName>
  </PropertyGroup>

В приведенном выше коде будет добавлено имя среды, как Developmentдля конфигурации отладки, или если конфигурация не указана. Для любой другой конфигурации имя среды будет Productionв сгенерированном файле web.config. Подробнее здесь

2. Добавление свойства EnvironmentName в профили публикации.

Мы также можем добавить <EnvironmentName>свойство в профиль публикации. Откройте файл профиля публикации, который находится в папке. Properties/PublishProfiles/{profilename.pubxml}Это установит имя среды в web.config при публикации проекта. Подробнее здесь

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

3. Параметры командной строки с использованием dotnet publish

Кроме того, мы можем передать свойство EnvironmentNameкак параметр командной строки dotnet publishкоманде. Следующая команда будет включать переменную среды, как Developmentв файле web.config.

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development

Абхинав Галодха
источник
8
Насколько я могу судить, это лучший ответ. Возможность установить его для профиля публикации действительно очень помогла мне.
Джонатан Куинт
Третий вариант мне подходит. Знаете ли вы, упоминается ли параметр / p: EnvironmentName где-нибудь в документации dotnet?
rasyadi 04
8
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Developmentэто именно то, что я искал. Спасибо!
Мэтт М.
Не могли бы вы указать, что означает «публикация в dotnet…», если кто-то хочет опубликовать в UAT, QA или Production?
crazyTech
76

Опция 1:

Чтобы установить переменную среды ASPNETCORE_ENVIRONMENT в Windows,

Командная строка - setx ASPNETCORE_ENVIRONMENT "Development"

PowerShell - $Env:ASPNETCORE_ENVIRONMENT = "Development"

Для других ОС обратитесь к этому - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments

Вариант 2:

Если вы хотите установить ASPNETCORE_ENVIRONMENT с помощью, web.configдобавьте aspNetCoreвот так:

<configuration>
  <!--
    Configure your application settings in appsettings.json. Learn more at http://go.microsoft.com/fwlink/?LinkId=786380
  -->
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath=".\MyApplication.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>
Санкет
источник
43
Оба эти варианта ужасны. 1) устанавливает это для всей ОС, я бы хотел, чтобы это было для каждого сайта в IIS. 2) AspNet Core не поддерживает преобразования web.config. Как вы предлагаете изменить web.config для развертывания?
Кугель
См. Официальную документацию здесь - docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module
Sanket
5
Как только вы
Sanket
5
такая конфигурация кажется очень запутанной.
koo9
2
Вы можете переопределить это в профилях публикации для нескольких сред.
cederlof
31

Простой способ установить его в Visual Studio IDE.

Проект> Свойства> Отладка> Переменные среды

введите описание изображения здесь

Марк Макнейл Бикейо
источник
3
Но тогда вам нужно помнить об изменении этого каждый раз, когда вам нужно публиковать в другой среде.
Алиссон
15
Это не так. Это работает только при запуске IDE. Сохраняет его в файле launchsettings.json, который принадлежит Visual Studio. Не будет работать для развертываний.
onefootswill
21

Вы должны следовать инструкциям, приведенным в документации , используя web.config.

<aspNetCore processPath="dotnet"
        arguments=".\MyApp.dll"
        stdoutLogEnabled="false"
        stdoutLogFile="\\?\%home%\LogFiles\aspnetcore-stdout">
  <environmentVariables>
    <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
    <environmentVariable name="CONFIG_DIR" value="f:\application_config" />
  </environmentVariables>
</aspNetCore>

Обратите внимание, что вы также можете установить другие переменные среды.

Модуль ASP.NET Core позволяет вам указать переменные среды для процесса, указанного в атрибуте processPath, указав их в одном или нескольких дочерних элементах environmentVariable элемента коллекции environmentVariables под элементом aspNetCore. Переменные среды, установленные в этом разделе, имеют приоритет над системными переменными среды для процесса.

Дэвид Пайн
источник
как мне установить его в консольном приложении .net core?
user441365
Настройте их в диалоговом окне «Переменные среды» Windows.
Дэвид Пайн
1
Но есть ли способ установить его в проекте, а не в ОС?
user441365
Не для консольных приложений в .NET Core, о которых я знаю ... нет - может быть, это - stackoverflow.com/a/46445432/2410379 ?
Дэвид Пайн
15

Вот как мы можем установить во время выполнения:

public class Program
{
    public static void Main(string[] args)
    {
        Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");

        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .Build();
}
Майтивилл
источник
Не уверен, почему это было отклонено, потому что это единственное, что сработало для меня.
pcalkins 07
1
Скорее всего, он был отклонен из-за жестко заданных значений в коде.
Кевин С.
Быстрее всего протестировать, но я согласен, что не то, что я хотел бы видеть в качестве зарегистрированного кода, в долгосрочной перспективе.
Бретт Ригби
хотя это жестко запрограммировано, я считаю, что это самый простой способ сделать это.
Отправляясь ушедшей
1
Мой предпочтительный метод, я использую его в сочетании с DEBUG, чтобы установить правильное значение.
Дэйв де Йонг,
7
  1. Создайте свои файлы appsettings. *. Json. (Примеры: appsettings.Development.json, appsettings.Staging.json, appsettings.Production.json)

  2. Добавьте свои переменные в эти файлы.

  3. Создайте отдельный профиль публикации для каждой среды, как обычно.

  4. Откройте PublishProfiles / Development.pubxml (имя будет основано на том, что вы назвали профилем публикации).

  5. Просто добавьте тег в PublishProfile, чтобы установить переменную EnvironmentName , все остальное сделает соглашение об именах файлов appsettings. *. Json.

    <PropertyGroup>
      <EnvironmentName>Development</EnvironmentName>
    </PropertyGroup>

Ссылка: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-3.1

См. Раздел «Настройка среды».

eliteproxy
источник
6

В последней версии dotnet cli (2.1.400 или выше) вы можете просто установить это свойство msbuild, $(EnvironmentName)и инструменты публикации позаботятся о добавлении ASPNETCORE_ENVIRONMENT в web.config с именем среды.

Кроме того, поддержка XDT доступна начиная с версии 2.2.100-preview1.

Образец: https://github.com/vijayrkn/webconfigtransform/blob/master/README.md

Виджайркн
источник
7
Не могли бы вы уточнить you can just set this msbuild property $(EnvironmentName) and publishили дать ссылку?
DanElliott 01
1
как мне установить его в консольном приложении .net core?
user441365
3

Эту переменную можно сохранить в json. Например, envsettings.json с содержимым, как показано ниже.

  {
   // Possible string values reported below. When empty it use ENV variable value or 
     // Visual Studio setting.
     // - Production
     // - Staging
     // - Test
     // - Development

   "ASPNETCORE_ENVIRONMENT": "Development"
  }

Позже измените свой program.cs, как показано ниже

  public class Program
  {
    public static IConfiguration Configuration { get; set; }
    public static void Main(string[] args)
    {
        var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var environmentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

        var builder = new ConfigurationBuilder()
               .SetBasePath(Directory.GetCurrentDirectory())
               .AddJsonFile("appsettings.json");

        Configuration = builder.Build();
          var webHostBuilder = new WebHostBuilder()
            .UseKestrel()
            .CaptureStartupErrors(true)
            .UseContentRoot(currentDirectoryPath)
            .UseIISIntegration()
            .UseStartup<Startup>();

        // If none is set it use Operative System hosting enviroment
        if (!string.IsNullOrWhiteSpace(environmentValue))
        {
            webHostBuilder.UseEnvironment(environmentValue);
        }

        var host = webHostBuilder.Build();

        host.Run();
     }
 }

Таким образом, он всегда будет включен в публикацию, и вы можете изменить его на необходимое значение в зависимости от среды, в которой размещен веб-сайт. Этот метод также можно использовать в консольном приложении, поскольку изменения внесены в Program.cs.

Nagashree Hs
источник
0

Я обнаружил, что это работает для меня, установив эту переменную непосредственно на платформе Azure (если вы ее используете). Просто выберите свое веб-приложение -> конфигурация -> настройки приложения и добавьте переменную и ее значение, затем нажмите кнопку «Сохранить».

Рэй
источник
0

Другой вариант, который мы используем в наших проектах, чтобы иметь возможность установить среду для каждого сайта, - это добавить в проект файл Parameters.xml со следующим содержимым:

<parameters>
      <parameter name="IIS Web Application Name" defaultValue="MyApp" tags="IisApp" />    
      <parameter name="Environment" description="Environment" tags="">
        <parameterEntry kind="XmlFile" scope="Web.config"  match="/configuration/location/system.webServer/aspNetCore/environmentVariables/environmentVariable[@name='ASPNETCORE_ENVIRONMENT']/@value" />
      </parameter>    
</parameters>

Действие сборки для этого файла - Содержимое, а действие копирования - Копировать, если новее, поэтому он будет частью пакета для развертывания.

Затем, чтобы развернуть пакет и настроить среду в выпуске в рамках задачи «WinRM - развертывание веб-приложений IIS» (она работает так же хорошо при использовании задачи «развертывание веб-приложения IIS»), мы устанавливаем дополнительные аргументы для msdeploy. :

-setParam:kind=ProviderPath,scope=contentPath,value="MySite" -setParam:name="Environment",value="Stage"

Таким образом, у нас может быть несколько выпусков, использующих один и тот же артефакт, но развернутых в разных средах.

Shahafo
источник
0

Я знаю, что это старый пост, но подумал, что добавлю в него свое простое решение, поскольку его никто не предлагал.

Я использую текущий каталог для определения текущей среды, затем переворачиваю строку подключения и переменную среды. Это отлично работает, если у вас есть соглашение об именах для папок вашего сайта, например test / beta / sandbox.

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        var dir = Environment.CurrentDirectory;
        string connectionString;

        if (dir.Contains("test", StringComparison.OrdinalIgnoreCase))
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development");
        }
        else
        {
            connectionString = new ConnectionStringBuilder(server: "xxx", database: "xxx").ConnectionString;
            Environment.SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Production");
        }

        optionsBuilder.UseSqlServer(connectionString);
        optionsBuilder.UseLazyLoadingProxies();
        optionsBuilder.EnableSensitiveDataLogging();
    }
Уильям Робинсон
источник