Использование нескольких сред в ASP.NET Core

Авторы: Рик Андерсон (Rick Anderson) и Кирк Ларкин (Kirk Larkin)

ASP.NET Core настраивает поведение приложения в зависимости от среды выполнения с помощью переменной среды.

Среды

Чтобы определить среду выполнения, ASP.NET Core считывает данные из следующих переменных среды:

  1. DOTNET_ENVIRONMENT.
  2. ASPNETCORE_ENVIRONMENT если вызывается метод WebApplication.CreateBuilder. Шаблоны по умолчанию для веб-приложений ASP.NET Core вызывают WebApplication.CreateBuilder. Значение ASPNETCORE_ENVIRONMENT переопределяет DOTNET_ENVIRONMENT.

Чтобы определить среду выполнения, ASP.NET Core считывает данные из следующих переменных среды:

  1. DOTNET_ENVIRONMENT.
  2. ASPNETCORE_ENVIRONMENT если вызывается метод WebApplication.CreateBuilder. Шаблоны по умолчанию для веб-приложений ASP.NET Core вызывают WebApplication.CreateBuilder. Значение DOTNET_ENVIRONMENT переопределяется ASPNETCORE_ENVIRONMENT при WebApplicationBuilder использовании. Для других узлов, таких как ConfigureWebHostDefaults и WebHost.CreateDefaultBuilder, ASPNETCORE_ENVIRONMENT имеет более высокий приоритет.

Переменной IHostEnvironment.EnvironmentName можно присвоить любое значение, но платформа предоставляет следующие значения:

  • Development: на локальном компьютере в файле launchSettings.json для ASPNETCORE_ENVIRONMENT задается значение Development.
  • Staging
  • Production: значение по умолчанию, если DOTNET_ENVIRONMENT и ASPNETCORE_ENVIRONMENT не заданы.

Следующий код:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Вспомогательная функция тега среды использует значение IHostEnvironment.EnvironmentName для включения или исключения разметки в элементе:

<environment include="Development">
    <div>Environment is Development</div>
</environment>
<environment exclude="Development">
    <div>Environment is NOT Development</div>
</environment>
<environment include="Staging,Development,Staging_2">
    <div>Environment is: Staging, Development or Staging_2</div>
</environment>

Страница со сведениями в примере кода включает предыдущую разметку и отображает значение IWebHostEnvironment.EnvironmentName.

В ОС Windows и macOS регистр символов в переменных среды и их значениях не учитывается. В ОС Linux в переменных среды и их значениях регистр символов по умолчанию учитывается.

Создание EnvironmentsSample

Пример кода, используемый в этой статье, основан на проекте Razor Pages с именем EnvironmentsSample.

Следующие команды .NET CLI создают и запускают веб-приложение с именем EnvironmentsSample:

dotnet new webapp -o EnvironmentsSample
cd EnvironmentsSample
dotnet run --verbosity normal

При запуске приложение отобразит выходные данные, аналогичные следующим:

info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7152
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5105
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\Path\To\EnvironmentsSample

Настройка среды в командной строке

Используйте флаг --environment, чтобы задать среду. Например:

dotnet run --environment Production

Предыдущая команда задает среду Production и отображает в окне командной строки выходные данные, аналогичные приведенным ниже:

info: Microsoft.Hosting.Lifetime[14]
      Now listening on: https://localhost:7262
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://localhost:5005
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: C:\Path\To\EnvironmentsSample

Разработка и launchSettings.json

В среде разработки могут быть включены функции, которые не должны быть доступны в рабочей среде. Например, шаблоны проектов ASP.NET Core включают в среде разработки страницу со сведениями об исключении для разработчика. Из-за затрат на производительность область проверка и проверка зависимостей происходит только в разработке.

Среду для локального компьютера разработки можно задать в файле Properties\launchSettings.json проекта. Значения среды, заданные в launchSettings.json переопределении значений в системной среде.

Файл launchSettings.json:

  • используется только на локальном компьютере разработки;
  • не развернут;
  • содержит параметры профиля.

В следующем фрагменте JSON показан файл launchSettings.json для веб-проекта ASP.NET Core с именем EnvironmentsSample, созданный с помощью Visual Studio или dotnet new:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:59481",
      "sslPort": 44308
    }
  },
  "profiles": {
    "EnvironmentsSample": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7152;http://localhost:5105",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Приведенный выше файл JSON содержит два профиля:

  • EnvironmentsSample: имя профиля — это имя проекта. Как первый из перечисленных профилей этот профиль используется по умолчанию. Ключ "commandName" имеет значение "Project", поэтому запускается веб-сервер Kestrel.

  • IIS Express: ключ "commandName" имеет значение "IISExpress", поэтому IISExpress является веб-сервером.

Профиль запуска можно задать для проекта или любого другого профиля, включенного в launchSettings.jsonнего. Например, на приведенном ниже изображении при выборе имени проекта запускается веб-сервер Kestrel.

IIS Express launch on menu

Значение commandName может определять запускаемый веб-сервер. commandName может иметь одно из следующих значений:

  • IISExpress : запускает IIS Express.
  • IIS : веб-сервер не запущен. Службы IIS должны быть доступны.
  • Project : запускает Kestrel.

Вкладка свойств проекта Отладка / Общие в Visual Studio 2022 содержит ссылку Открыть пользовательский интерфейс профилей запуска отладки. Эта ссылка открывает диалоговое окно "Профили запуска" , которое позволяет изменять параметры переменной среды в launchSettings.json файле. Диалоговое окно Профили запуска также можно открыть из меню Отладка, выбрав Свойства отладки <имя проекта>. Для вступления в силу изменений, внесенных в профили проекта, может потребоваться перезапуск веб-сервера. Чтобы сервер Kestrel обнаружил изменения, внесенные в среду, его необходимо перезапустить.

Project Properties Setting Environment variables

launchSettings.json Следующий файл содержит несколько профилей:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:59481",
      "sslPort": 44308
    }
  },
  "profiles": {
    "EnvironmentsSample": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7152;http://localhost:5105",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "EnvironmentsSample-Staging": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7152;http://localhost:5105",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging",
        "ASPNETCORE_DETAILEDERRORS": "1",
        "ASPNETCORE_SHUTDOWNTIMEOUTSECONDS": "3"
      }
    },
    "EnvironmentsSample-Production": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7152;http://localhost:5105",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Профили можно выбирать:

  • В пользовательском интерфейсе Visual Studio.

  • С помощью команды CLI dotnet run. При этом для параметра --launch-profile нужно задать имя профиля. Этот подход поддерживает только профили Kestrel.

    dotnet run --launch-profile "EnvironmentsSample"
    

Предупреждение

launchSettings.json не следует хранить секреты. Для хранения секретов во время разработки в локальной среде можно использовать средство Secret Manager.

При использовании Visual Studio Code переменные среды можно задать в .vscode/launch.json файле. В следующем примере задается несколько переменных среды для значений конфигурации узла:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (web)",
            "type": "coreclr",
            // Configuration ommitted for brevity.
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development",
                "ASPNETCORE_URLS": "https://localhost:5001",
                "ASPNETCORE_DETAILEDERRORS": "1",
                "ASPNETCORE_SHUTDOWNTIMEOUTSECONDS": "3"
            },
            // Configuration ommitted for brevity.

Файл .vscode/launch.json используется только Visual Studio Code.

Производство

Конфигурация рабочей среды должна обеспечивать максимальный уровень безопасности, производительности и надежности приложений. Некоторые общие параметры, отличные от разработки:

  • Кэширование.
  • ресурсы на стороне клиента объединяются в пакеты, уплотняются и могут предоставляться из сети CDN;
  • страницы с сообщениями об ошибках диагностики отключены;
  • включены страницы с понятными пользователям сообщениями об ошибках;
  • включены средства ведения журналов и мониторинга в рабочей среде (например, с использованием Application Insights).

Настройка среды путем настройки переменной среды

Часто бывает полезным указать определенную среду для тестирования с переменной среды или параметром платформы. Если среда не указана, по умолчанию используется среда Production, в которой большинство функций отладки отключено. Способ указания среды зависит от операционной системы.

При создании узла среду приложения определяет последний параметр среды, считанный приложением. Среду приложения невозможно изменить во время его выполнения.

На странице со сведениями в примере кода отображается значение IWebHostEnvironment.EnvironmentName.

Служба приложений Azure

Production — значение по умолчанию, если DOTNET_ENVIRONMENT и ASPNETCORE_ENVIRONMENT не заданы. Приложения, развернутые в Azure, по умолчанию являются рабочими (Production).

Чтобы задать среду в приложении Службы приложений Azure с помощью портала, сделайте следующее:

  1. Выберите приложение на странице Службы приложений.
  2. В группе Параметры выберите Конфигурация.
  3. На вкладке Параметры приложения выберите Новый параметр приложения.
  4. В окне Добавить или изменить параметр приложения в поле Имя введите ASPNETCORE_ENVIRONMENT. В поле Значение укажите среду (например, Staging).
  5. Установите флажок Параметр слота развертывания, если нужно, чтобы параметр среды оставался в текущем слоте при замене слота развертывания. Дополнительные сведения см. в статье Set up staging environments in Azure App Service (Настройка промежуточных сред в Службе приложений Azure) в документации по Azure.
  6. Нажмите кнопку ОК, чтобы закрыть диалоговое окно Добавить или изменить параметр приложения.
  7. Нажмите кнопку Сохранить в верхней части страницы Конфигурация.

Служба приложений Azure автоматически перезапускает приложение после добавления, изменения или удаления параметра приложения на портале Azure.

Windows — настройка переменной среды для процесса

Значения среды в переопределении, заданные в launchSettings.json системной среде.

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

set ASPNETCORE_ENVIRONMENT=Staging
dotnet run --no-launch-profile
$Env:ASPNETCORE_ENVIRONMENT = "Staging"
dotnet run --no-launch-profile

Windows — глобальная настройка переменной среды

Предыдущая команда позволяет задать ASPNETCORE_ENVIRONMENT только для процессов, запускаемых из этого командного окна.

Чтобы задать это значение в Windows на глобальном уровне, используйте один из следующих подходов.

  • Откройте Панель управления>Система>Дополнительные параметры системы и добавьте или измените значение ASPNETCORE_ENVIRONMENT:

    System Advanced Properties

    ASPNET Core Environment Variable

  • Откройте командную строку администратора и выполните команду setx либо откройте командную строку администратора PowerShell и используйте [Environment]::SetEnvironmentVariable:

    • setx ASPNETCORE_ENVIRONMENT Staging /M
      

      Параметр /M задает переменную среды на уровне системы. Если параметр /M не используется, переменная среды задается для учетной записи пользователя.

    • [Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Staging", "Machine")
      

      Параметр Machine задает переменную среды на уровне системы. При изменении значения параметра на User переменная среды задается для учетной записи пользователя.

Если переменная среды ASPNETCORE_ENVIRONMENT задана глобально, она действует для dotnet run в любом окне командной строки, открываемом после установки значения. Значения среды в переопределении, заданные в launchSettings.json системной среде.

Windows — использование web.config

Сведения об установке переменной среды ASPNETCORE_ENVIRONMENT с помощью web.config см. в разделе Настройка переменных среды статьи Файл web.config.

Windows — развертывания IIS

Включите свойство <EnvironmentName> в профиле публикации (.pubxml) или файле проекта. При этом подходе во время публикации проекта среда задается в файле web.config:

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

Чтобы задать переменную среды ASPNETCORE_ENVIRONMENT для приложения, выполняющегося в изолированном пуле приложений (такая возможность поддерживается в службах IIS 10.0 и более поздних версий), см. подраздел, посвященный команде AppCmd.exe, в разделе Переменные среды <environmentVariables>. Если переменная среды ASPNETCORE_ENVIRONMENT задана для пула приложений, ее значение переопределяет значение на уровне системы.

При размещении приложения в службах IIS и добавлении или изменении переменной среды ASPNETCORE_ENVIRONMENT используйте один из следующих подходов по применению нового значения в приложении.

  • Из командной строки выполните команду net stop was /y, за которой следует net start w3svc.
  • Перезапустите сервер.

macOS

Задать текущую среду в macOS можно в командной строке при запуске приложения:

ASPNETCORE_ENVIRONMENT=Staging dotnet run

Также можно задать среду с помощью команды export до запуска приложения:

export ASPNETCORE_ENVIRONMENT=Staging

Переменные среды на уровне компьютера задаются в файле BASHRC или BASH_PROFILE. Измените файл в любом текстовом редакторе. Добавьте следующий оператор:

export ASPNETCORE_ENVIRONMENT=Staging

Linux

В дистрибутивах Linux используйте команду export в командной строке для значений переменных на уровне сеанса или в файле bash_profile для значений среды на уровне компьютера.

Указание среды в коде

Чтобы задать среду в коде, при создании WebApplicationBuilder используйте WebApplicationOptions.EnvironmentName, как показано в следующем примере:

var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
    EnvironmentName = Environments.Staging
}); 

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Конфигурация для разных сред

Сведения о загрузке конфигурации в зависимости от среды см. в разделе Конфигурация в ASP.NET Core.

Настройка служб и ПО промежуточного слоя в зависимости от среды

Используйте WebApplicationBuilder.Environment или WebApplication.Environment для условного добавления служб или ПО промежуточного слоя в зависимости от текущей среды. Шаблон проекта включает пример кода, который добавляет ПО промежуточного слоя, только если текущая среда не является средой для разработки:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

Выделенный код проверяет текущую среду при создании конвейера запросов. Чтобы проверить текущую среду во время настройки служб, используйте builder.Environment вместо app.Environment.

Дополнительные ресурсы

Авторы: Рик Андерсон (Rick Anderson) и Кирк Ларкин (Kirk Larkin)

ASP.NET Core настраивает поведение приложения в зависимости от среды выполнения с помощью переменной среды.

Среды

Чтобы определить среду выполнения, ASP.NET Core считывает данные из следующих переменных среды:

  1. DOTNET_ENVIRONMENT.
  2. ASPNETCORE_ENVIRONMENT при вызове ConfigureWebHostDefaults. Шаблоны по умолчанию для веб-приложений ASP.NET Core вызывают ConfigureWebHostDefaults. Значение ASPNETCORE_ENVIRONMENT переопределяет DOTNET_ENVIRONMENT.

Переменной IHostEnvironment.EnvironmentName можно присвоить любое значение, но платформа предоставляет следующие значения:

  • Development: на локальном компьютере в файле launchSettings.json для ASPNETCORE_ENVIRONMENT задается значение Development.
  • Staging
  • Production : значение по умолчанию, если DOTNET_ENVIRONMENT и ASPNETCORE_ENVIRONMENT не задано.

Следующий код:

  • Вызывается UseDeveloperExceptionPage, когда ASPNETCORE_ENVIRONMENT имеет значение Development.
  • Вызывается UseExceptionHandler, если для свойства ASPNETCORE_ENVIRONMENT задано значение Staging, Production или Staging_2.
  • Позволяет внедрить IWebHostEnvironment в Startup.Configure. Этот подход удобен, когда для приложения требуется просто скорректировать Startup.Configure для нескольких сред с минимальными различиями в коде для каждой среды.
  • Это аналогично коду, созданному на основе шаблонов ASP.NET Core.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    if (env.IsProduction() || env.IsStaging() || env.IsEnvironment("Staging_2"))
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

Вспомогательная функция тега среды использует значение IHostEnvironment.EnvironmentName для включения или исключения разметки в элементе:

<environment include="Development">
    <div>The effective tag is: <environment include="Development"></div>
</environment>
<environment exclude="Development">
    <div>The effective tag is: <environment exclude="Development"></div>
</environment>
<environment include="Staging,Development,Staging_2">
    <div>
        The effective tag is:
        <environment include="Staging,Development,Staging_2">
    </div>
</environment>

Страница со сведениями в примере кода включает предыдущую разметку и отображает значение IWebHostEnvironment.EnvironmentName.

В ОС Windows и macOS регистр символов в переменных среды и их значениях не учитывается. В ОС Linux в переменных среды и их значениях регистр символов по умолчанию учитывается.

Создание EnvironmentsSample

Пример кода, используемый в этом документе, основан на проекте Razor Pages с именем EnvironmentsSample.

Следующий код позволяет создать и запустить веб-приложение с именем EnvironmentsSample:

dotnet new webapp -o EnvironmentsSample
cd EnvironmentsSample
dotnet run --verbosity normal

При запуске приложения отображаются некоторые из следующих выходных данных:

Using launch settings from c:\tmp\EnvironmentsSample\Properties\launchSettings.json
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: c:\tmp\EnvironmentsSample

Разработка и launchSettings.json

В среде разработки могут быть включены функции, которые не должны быть доступны в рабочей среде. Например, шаблоны ASP.NET Core включают в среде разработки страницу со сведениями об исключении для разработчика.

Среду для локального компьютера разработки можно задать в файле Properties\launchSettings.json проекта. Значения среды, заданные в launchSettings.json переопределении значений в системной среде.

Файл launchSettings.json:

  • используется только на локальном компьютере разработки;
  • не развернут;
  • содержит параметры профиля.

В следующем фрагменте JSON показан файл launchSettings.json для веб-проекта ASP.NET Core с именем EnvironmentsSample, созданный с помощью Visual Studio или dotnet new:

{
  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:64645",
      "sslPort": 44366
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "EnvironmentsSample": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Предыдущая разметка содержит два профиля:

  • IIS Express: профиль по умолчанию, используемый при запуске приложения из Visual Studio. Ключ "commandName" имеет значение "IISExpress", поэтому IISExpress является веб-сервером. Профиль запуска можно задать для проекта или любого другого профиля. Например, на приведенном ниже изображении при выборе имени проекта запускается веб-сервер Kestrel.

    IIS Express launch on menu

  • EnvironmentsSample: имя профиля — это имя проекта. Этот профиль используется по умолчанию при запуске приложения с помощью dotnet run. Ключ "commandName" имеет значение "Project", поэтому запускается веб-сервер Kestrel.

Значение commandName может определять запускаемый веб-сервер. commandName может иметь одно из следующих значений:

  • IISExpress : запускает IIS Express.
  • IIS : веб-сервер не запущен. Службы IIS должны быть доступны.
  • Project : запускает Kestrel.

Вкладка "Отладка проекта Visual Studio" предоставляет графический интерфейс для редактирования launchSettings.json файла. Для вступления в силу изменений, внесенных в профили проекта, может потребоваться перезапуск веб-сервера. Чтобы сервер Kestrel обнаружил изменения, внесенные в среду, его необходимо перезапустить.

Project Properties Setting Environment variables

launchSettings.json Следующий файл содержит несколько профилей:

{
  "iisSettings": {
    "windowsAuthentication": false, 
    "anonymousAuthentication": true, 
    "iisExpress": {
      "applicationUrl": "http://localhost:64645",
      "sslPort": 44366
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IISX-Production": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      }
    },
    "IISX-Staging": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging",
        "ASPNETCORE_DETAILEDERRORS": "1",
        "ASPNETCORE_SHUTDOWNTIMEOUTSECONDS": "3"
      }
    },
    "EnvironmentsSample": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "KestrelStaging": {
      "commandName": "Project",
      "launchBrowser": true,
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging"
      }
    }
  }
}

Профили можно выбирать:

  • В пользовательском интерфейсе Visual Studio.

  • С помощью команды dotnet run в командной оболочке. При этом для параметра --launch-profile нужно задать имя профиля. Этот подход поддерживает только профили Kestrel.

    dotnet run --launch-profile "SampleApp"
    

Предупреждение

launchSettings.json не следует хранить секреты. Для хранения секретов во время разработки в локальной среде можно использовать средство Secret Manager.

При использовании Visual Studio Code переменные среды можно задать в .vscode/launch.json файле. В следующем примере задается несколько переменных среды для значений конфигурации узла:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (web)",
            "type": "coreclr",
            // Configuration ommitted for brevity.
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development",
                "ASPNETCORE_URLS": "https://localhost:5001",
                "ASPNETCORE_DETAILEDERRORS": "1",
                "ASPNETCORE_SHUTDOWNTIMEOUTSECONDS": "3"
            },
            // Configuration ommitted for brevity.

Файл .vscode/launch.json используется только Visual Studio Code.

Производство

Конфигурация рабочей среды должна обеспечивать максимальный уровень безопасности, производительности и надежности приложений. Некоторые общие параметры, отличные от разработки:

  • Кэширование.
  • ресурсы на стороне клиента объединяются в пакеты, уплотняются и могут предоставляться из сети CDN;
  • страницы с сообщениями об ошибках диагностики отключены;
  • включены страницы с понятными пользователям сообщениями об ошибках;
  • включены средства ведения журналов и мониторинга в рабочей среде (например, с использованием Application Insights).

Указание среды

Часто бывает полезным указать определенную среду для тестирования с переменной среды или параметром платформы. Если среда не указана, по умолчанию используется среда Production, в которой большинство функций отладки отключено. Способ указания среды зависит от операционной системы.

При создании узла среду приложения определяет последний параметр среды, считанный приложением. Среду приложения невозможно изменить во время его выполнения.

На странице со сведениями в примере кода отображается значение IWebHostEnvironment.EnvironmentName.

Служба приложений Azure

Production — значение по умолчанию, если DOTNET_ENVIRONMENT и ASPNETCORE_ENVIRONMENT не заданы. Приложения, развернутые в Azure, по умолчанию являются рабочими (Production).

Чтобы установить среду в службе приложений Azure, выполните следующие действия:

  1. Выберите приложение из колонки Службы приложений.
  2. В группе Параметры выберите колонку Конфигурация.
  3. На вкладке Параметры приложения выберите Новый параметр приложения.
  4. В окне Добавить или изменить параметр приложения в поле Имя введите ASPNETCORE_ENVIRONMENT. В поле Значение укажите среду (например, Staging).
  5. Установите флажок Параметр слота развертывания, если нужно, чтобы параметр среды оставался в текущем слоте при замене слота развертывания. Дополнительные сведения см. в статье Set up staging environments in Azure App Service (Настройка промежуточных сред в Службе приложений Azure) в документации по Azure.
  6. Нажмите кнопку ОК, чтобы закрыть окно Добавить или изменить параметр приложения.
  7. Нажмите кнопку Сохранить в верхней части колонки Конфигурация.

Служба приложений Azure автоматически перезапускает приложение после добавления, изменения или удаления параметра приложения на портале Azure.

Windows

Значения среды в переопределении, заданные в launchSettings.json системной среде.

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

Командная строка

set ASPNETCORE_ENVIRONMENT=Staging
dotnet run --no-launch-profile

PowerShell

$Env:ASPNETCORE_ENVIRONMENT = "Staging"
dotnet run --no-launch-profile

Предыдущая команда позволяет задать ASPNETCORE_ENVIRONMENT только для процессов, запускаемых из этого командного окна.

Чтобы задать это значение в Windows на глобальном уровне, используйте один из следующих подходов.

  • Откройте Панель управления>Система>Дополнительные параметры системы и добавьте или измените значение ASPNETCORE_ENVIRONMENT:

    System Advanced Properties

    ASPNET Core Environment Variable

  • Откройте командную строку администратора и выполните команду setx либо откройте командную строку администратора PowerShell и используйте [Environment]::SetEnvironmentVariable:

    Командная строка

    setx ASPNETCORE_ENVIRONMENT Staging /M
    

    Параметр /M указывает на установку переменной среды на уровне системы. Если параметр /M не используется, переменная среды задается для учетной записи пользователя.

    PowerShell

    [Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Staging", "Machine")
    

    Значение параметра Machine указывает на установку переменной среды на уровне системы. При изменении значения параметра на User переменная среды задается для учетной записи пользователя.

Если переменная среды ASPNETCORE_ENVIRONMENT задана глобально, она действует для dotnet run в любом окне командной строки, открываемом после установки значения. Значения среды в переопределении, заданные в launchSettings.json системной среде.

web.config

Сведения об установке переменной среды ASPNETCORE_ENVIRONMENT с помощью web.config см. в разделе Настройка переменных среды статьи Файл web.config.

Файл проекта или профиль публикации

Для развертываний IIS в Windows : включите свойство <EnvironmentName> в профиль публикации (.pubxml) или файл проекта. При этом подходе во время публикации проекта среда задается в файле web.config:

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

Пул приложений IIS

Чтобы задать переменную среды ASPNETCORE_ENVIRONMENT для приложения, выполняющегося в изолированном пуле приложений (такая возможность поддерживается в службах IIS 10.0 и более поздних версий), см. подраздел, посвященный команде AppCmd.exe, в разделе Переменные среды <environmentVariables>. Если переменная среды ASPNETCORE_ENVIRONMENT задана для пула приложений, ее значение переопределяет значение на уровне системы.

При размещении приложения в службах IIS и добавлении или изменении переменной среды ASPNETCORE_ENVIRONMENT используйте один из следующих подходов по применению нового значения в приложении.

  • Из командной строки выполните команду net stop was /y, за которой следует net start w3svc.
  • Перезапустите сервер.

macOS

Задать текущую среду в macOS можно в командной строке при запуске приложения:

ASPNETCORE_ENVIRONMENT=Staging dotnet run

Также можно задать среду с помощью команды export до запуска приложения:

export ASPNETCORE_ENVIRONMENT=Staging

Переменные среды на уровне компьютера задаются в файле BASHRC или BASH_PROFILE. Измените файл в любом текстовом редакторе. Добавьте следующий оператор:

export ASPNETCORE_ENVIRONMENT=Staging

Linux

В дистрибутивах Linux используйте команду export в командной строке для значений переменных на уровне сеанса или в файле BASH_PROFILE для значений среды на уровне компьютера.

Указание среды в коде

Вызовите UseEnvironment при создании узла. См. статью Универсальный узел .NET в ASP.NET Core.

Конфигурация для разных сред

Сведения о загрузке конфигурации в зависимости от среды см. в разделе Конфигурация в ASP.NET Core.

Класс Startup и его методы для разных сред

Внедрение IWebHostEnvironment в класс Startup

Внедрите IWebHostEnvironment в конструктор Startup. Этот подход удобен, когда для приложения требуется настроить Startup всего для нескольких сред с минимальными различиями в коде для каждой среды.

В следующем примере :

  • Среда хранится в поле _env.
  • _env используется в ConfigureServices и Configure для применения конфигурации запуска на основе среды приложения.
public class Startup
{
    public Startup(IConfiguration configuration, IWebHostEnvironment env)
    {
        Configuration = configuration;
        _env = env;
    }

    public IConfiguration Configuration { get; }
    private readonly IWebHostEnvironment _env;

    public void ConfigureServices(IServiceCollection services)
    {
        if (_env.IsDevelopment())
        {
            Console.WriteLine(_env.EnvironmentName);
        }
        else if (_env.IsStaging())
        {
            Console.WriteLine(_env.EnvironmentName);
        }
        else
        {
            Console.WriteLine("Not dev or staging");
        }

        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app)
    {
        if (_env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Соглашения о классе Startup

При запуске приложения ASP.NET Core класс Startup выполняет его начальную загрузку. Приложение может определять несколько классов Startup для различных сред. Подходящий класс Startup выбирается во время выполнения. Класс, у которого суффикс имени соответствует текущей среде, получает приоритет. Если соответствующий класс Startup{EnvironmentName} не найден, используется класс Startup. Этот подход удобен, когда для приложения требуется настроить запуск для нескольких сред с многочисленными различиями в коде для каждой среды. Для обычных приложений такой подход не нужно использовать.

Чтобы реализовать классы Startup на основе среды, создайте классы Startup{EnvironmentName} и резервный класс Startup:

public class StartupDevelopment
{
    public StartupDevelopment(IConfiguration configuration)
    {
        Configuration = configuration;
        Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Name);
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseDeveloperExceptionPage();

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

public class StartupProduction
{
    public StartupProduction(IConfiguration configuration)
    {
        Configuration = configuration;
        Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Name);
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app)
    {

        app.UseExceptionHandler("/Error");
        app.UseHsts();

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Name);
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

Используйте перегрузку UseStartup(IWebHostBuilder, String) , принимающую имя сборки:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args)
    {
        var assemblyName = typeof(Startup).GetTypeInfo().Assembly.FullName;

        return   Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup(assemblyName);
            });
    }
}

Соглашения о методах Startup

Методы Configure и ConfigureServices поддерживают версии для конкретных сред в формате Configure<EnvironmentName> и Configure<EnvironmentName>Services. Если соответствующий метод Configure<EnvironmentName>Services или Configure<EnvironmentName> не найден, используется метод ConfigureServices или Configure соответственно. Этот подход удобен, когда для приложения требуется настроить запуск для нескольких сред с многочисленными различиями в коде для каждой среды:

public class Startup
{
    private void StartupConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void ConfigureDevelopmentServices(IServiceCollection services)
    {
        MyTrace.TraceMessage();
        StartupConfigureServices(services);
    }

    public void ConfigureStagingServices(IServiceCollection services)
    {
        MyTrace.TraceMessage();
        StartupConfigureServices(services);
    }

    public void ConfigureProductionServices(IServiceCollection services)
    {
        MyTrace.TraceMessage();
        StartupConfigureServices(services);
    }

    public void ConfigureServices(IServiceCollection services)
    {
        MyTrace.TraceMessage();
        StartupConfigureServices(services);
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        MyTrace.TraceMessage();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }

    public void ConfigureStaging(IApplicationBuilder app, IWebHostEnvironment env)
    {
        MyTrace.TraceMessage();

        app.UseExceptionHandler("/Error");
        app.UseHsts();

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

public static class MyTrace
{
    public static void TraceMessage([CallerMemberName] string memberName = "")
    {
        Console.WriteLine($"Method: {memberName}");
    }
}

Дополнительные ресурсы