Использование нескольких сред в ASP.NET Core
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 8 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в статье о политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 8 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 8 этой статьи.
Авторы: Рик Андерсон (Rick Anderson) и Кирк Ларкин (Kirk Larkin)
ASP.NET Core настраивает поведение приложения в зависимости от среды выполнения с помощью переменной среды.
Инструкции Blazor по средам, которые добавляются в инструкции, приведенные в этой статье, см . в разделе ASP.NET Основные Blazor среды.
Среды
Чтобы определить среду выполнения, ASP.NET Core считывает данные из следующих переменных среды:
- DOTNET_ENVIRONMENT.
ASPNETCORE_ENVIRONMENT
если вызывается метод WebApplication.CreateBuilder. Шаблоны по умолчанию для веб-приложений ASP.NET Core вызываютWebApplication.CreateBuilder
. ЗначениеASPNETCORE_ENVIRONMENT
переопределяетDOTNET_ENVIRONMENT
.
Чтобы определить среду выполнения, ASP.NET Core считывает данные из следующих переменных среды:
- DOTNET_ENVIRONMENT.
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
не заданы.
Следующий код:
- Это аналогично коду, созданному на основе шаблонов ASP.NET Core.
- Включает страницу со сведениями об исключении для разработчика, если для
ASPNETCORE_ENVIRONMENT
задано значениеDevelopment
. Это происходит автоматически благодаря методу WebApplication.CreateBuilder. - Вызывает UseExceptionHandler, если переменная
ASPNETCORE_ENVIRONMENT
имеет любое значение, кромеDevelopment
. - Предоставляет экземпляр IWebHostEnvironment в свойстве Environment
WebApplication
.
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.
Значение commandName
может определять запускаемый веб-сервер. commandName
может иметь одно из следующих значений:
IISExpress
: запускает IIS Express.IIS
: веб-сервер не запущен. Службы IIS должны быть доступны.Project
: запускает Kestrel.
Вкладка свойств проекта Отладка / Общие в Visual Studio 2022 содержит ссылку Открыть пользовательский интерфейс профилей запуска отладки. Эта ссылка открывает диалоговое окно "Профили запуска" , которое позволяет изменять параметры переменной среды в launchSettings.json
файле. Диалоговое окно Профили запуска также можно открыть из меню Отладка, выбрав Свойства отладки <имя проекта>. Для вступления в силу изменений, внесенных в профили проекта, может потребоваться перезапуск веб-сервера. Чтобы сервер Kestrel обнаружил изменения, внесенные в среду, его необходимо перезапустить.
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 с помощью портала, сделайте следующее:
- Выберите приложение на странице Службы приложений.
- В группе "Параметры" выберите переменные среды.
- На вкладке "Параметры приложения" нажмите кнопку "+ Добавить".
- В окне Добавить или изменить параметр приложения в поле Имя введите
ASPNETCORE_ENVIRONMENT
. В поле Значение укажите среду (например,Staging
). - Установите флажок Параметр слота развертывания, если нужно, чтобы параметр среды оставался в текущем слоте при замене слота развертывания. Дополнительные сведения см. в статье Set up staging environments in Azure App Service (Настройка промежуточных сред в Службе приложений Azure) в документации по Azure.
- Нажмите кнопку ОК, чтобы закрыть диалоговое окно Добавить или изменить параметр приложения.
- Нажмите кнопку Сохранить в верхней части страницы Конфигурация.
Служба приложений 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
:Откройте командную строку администратора и выполните команду
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 считывает данные из следующих переменных среды:
- DOTNET_ENVIRONMENT.
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.EnvironmentsSample
: имя профиля — это имя проекта. Этот профиль используется по умолчанию при запуске приложения с помощьюdotnet run
. Ключ"commandName"
имеет значение"Project"
, поэтому запускается веб-сервер Kestrel.
Значение commandName
может определять запускаемый веб-сервер. commandName
может иметь одно из следующих значений:
IISExpress
: запускает IIS Express.IIS
: веб-сервер не запущен. Службы IIS должны быть доступны.Project
: запускает Kestrel.
Вкладка "Отладка проекта Visual Studio" предоставляет графический интерфейс для редактирования launchSettings.json
файла. Для вступления в силу изменений, внесенных в профили проекта, может потребоваться перезапуск веб-сервера. Чтобы сервер Kestrel обнаружил изменения, внесенные в среду, его необходимо перезапустить.
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, выполните следующие действия:
- Выберите приложение из колонки Службы приложений.
- В группе Параметры выберите колонку Конфигурация.
- На вкладке Параметры приложения выберите Новый параметр приложения.
- В окне Добавить или изменить параметр приложения в поле Имя введите
ASPNETCORE_ENVIRONMENT
. В поле Значение укажите среду (например,Staging
). - Установите флажок Параметр слота развертывания, если нужно, чтобы параметр среды оставался в текущем слоте при замене слота развертывания. Дополнительные сведения см. в статье Set up staging environments in Azure App Service (Настройка промежуточных сред в Службе приложений Azure) в документации по Azure.
- Нажмите кнопку ОК, чтобы закрыть окно Добавить или изменить параметр приложения.
- Нажмите кнопку Сохранить в верхней части колонки Конфигурация.
Служба приложений 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
:Откройте командную строку администратора и выполните команду
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}");
}
}
Дополнительные ресурсы
ASP.NET Core