Работа с несколькими средами

Steve Smith

ASP.NET Core поддерживает работу приложения в нескольких средах, таких как development, staging и production. Переменные среды используются для того, чтобы определить, в какой среде запущено приложение, и таким образом приложение можно настроить соответствующим образом.

Просмотрите или скачайте пример с GitHub.

Development, Staging, Production

ASP.NET Core работает с отдельными переменными среды, ASPNETCORE_ENVIRONMENT, чтобы описать среду, в которой на данный момент запущено приложение. Эти переменные могут быть настроены так, как вам нравится, но по соглашению используется три значения: Development, Staging и Production. Эти значения используются в шаблонах ASP.NET Core.

Текущая среда может быть определена программно в вашем приложении. Кроме того, вы можете использовать Tag Helper Environment, который позволяет включать определенные разделы в view, основываясь на текущей среде.

Примечание

Имя среды разработки не чувствительно к регистру. Вы можете присвоить имени переменной Development, или development, или DEVELOPMENT - результат будет одинаков.

Development

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

../_images/project-properties-debug.png

Если вы меняете настройки по умолчанию, то эти изменения будут храниться в файле launchSettings.json в папке Properties. В этом файле содержаться настройки, которые конкретны для определенного профиля Visual Studio, включая переменные среды, которые нужно использовать. (См. Серверы, если хотите узнать больше о профилях отладки). Например, после добавления другого профиля, настроенного на использование IIS Express, но с использованием значения ASPNETCORE_ENVIRONMENT для Staging вы увидите такой файл launchSettings.json:

launchSettings.json
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:40088/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express (Staging)": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Staging"
      }
    }
  }
}

Примечание

Изменения, сделанные напрямую в профилях или launchSettings.json, не будут работать, пока вы не перезагрузите веб сервер.

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

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

Переменные среды, хранящиеся в launchSettings.json, никак не защищены, и они являются частью репозитория исходного кода вашего проекта. Никогда не храните конфиденциальные данные в этом файле. Если вам нужно место для хранения таких данных, используйте инструмент Secret Manager, описанный в Safe storage of app secrets during development.

Staging

По умолчанию среда Staging является предпроизводственной средой, которая используется для конечного тестирования перед производственной версией. В идеале ее характеристики не должны отличаться от production, чтобы вы могли все хорошо протестировать, прежде чем приложение будет представлено пользователям.

Production

Production - это среда, в которой запускается приложение, когда оно должно быть представлено конечному пользователю. Эта среда должна быть настроена на максимальную безопасность, производительность и стабильность. Некоторые общие настройки в среде production могут отличаться от тех, что присутствуют в среде development:

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

Лучше всего не тестировать приложение во многих его частях. Вместо этого мы советуем вам проверять класс Startup.

Определение среды разработки во время рантайма

Сервис :dn:iface:`~Microsoft.AspNetCore.Hosting.IHostingEnvironment` является корневым сервисом для работы со средами. Данный сервис может быть внедрен в приложение с помощью Внедрение зависимостей (Dependency Injection). Шаблоны ASP.NET Core в Visual Studio используют такой подход, чтобы загрузить конфигурационные файлы для конкретной среды и для настроек обработки ошибок. В обоих случаях нужно вызывать :dn:prop:`~Microsoft.AspNetCore.Hosting.IHostingEnvironment.EnvironmentName` или :dn:method:`~Microsoft.AspNetCore.Hosting.HostingEnvironmentExtensions.IsEnvironment` для экземпляров :dn:iface:`~Microsoft.AspNetCore.Hosting.IHostingEnvironment`, которые передаются определенному методу.

Примечание

Если вы хотите проверить, запущено ли приложение в определенной среде, используйте env.IsEnvironment("environmentname"), (вместо env.EnvironmentName == "Development" , например).

Вы можете использовать следующий код в методе Configure, чтобы настроить обработку ошибок в определенной среде:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseDatabaseErrorPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }
    // ...

Если приложение запущено в среде Development, тогда она включает рантайм поддержку, необходимую для использования “BrowserLink” в Visual Studio, страницы с ошибками при разработке и специальные страницы с ошибками для БД. Иначе если приложение не запущено в среде разработки, настраивается стандартная страница обработки ошибок, которая будет отображаться в ответ на любое необработанное исключение.

Возможно, вам потребуется определить, какой контент отправлять клиенту во время рантайма в зависимости от текущей среды. Например, в среде разработки вы обычно используете полные версии скриптов и страниц стилей, что упрощает отладку. При тестировании и разворачивании используются сокращенные версии и обычно из CDN. Это можно сделать с помощью Environment tag helper. Тэг-хелпер Environment представит только контекст, если текущая среда соответствует той, что указана с помощью атрибута names.

<environment names="Development">
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css"
          asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
          asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
    <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>

О тэг-хелперах вы можете прочесть здесь: Введение в Тэг-хелперы (Tag Helpers).

Соглашения, использующиеся при запуске приложения

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

В ASP.NET Core класс Startup используется для запуска приложения, загрузки настроек и т.д. (см. запуск приложения ASP.NET). Однако если есть класс Startup{EnvironmentName} (например, StartupDevelopment) и переменная среды ASPNETCORE_ENVIRONMENT соответствует данному имени, то будет использован этот класс. Так что вы можете настроить для разработки Startup, а StartupProduction будет использоваться для производственной версии.

Кроме того, чтобы использовать отдельный класс Startup, основываясь на текущей среде, вы также можете настроить приложение в Startup. Методы Configure() и ConfigureServices() поддерживают разные среды и версии Startup, Configure[Environment]() и Configure[Environment]Services(). Если вы определите метод ConfigureDevelopment(), он будет вызван вместо Configure(), если средой является development. Также в одной и той же среде будет вызван ConfigureDevelopmentServices() вместо ConfigureServices().

Резюме

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

Поделись хорошей новостью с друзьями!
Следи за новостями!