IWebHostEnvironment и окружение

Последнее обновление: 20.12.2021

Для взаимодействия с окружением, в котором запущено приложение, фреймфорк ASP.NET Core предоставляет интерфейс IWebHostEnvironment. Этот интерфейс предлагает ряд свойств, с помощью которых мы можем получить информацию об окружении:

  • ApplicationName: хранит имя приложения

  • EnvironmentName: хранит название среды, в которой хостируется приложение

  • ContentRootPath: хранит путь к корневой папке приложения

  • WebRootPath: хранит путь к папке, в которой хранится статический контент приложения. По умолчанию это папка wwwroot

  • ContentRootFileProvider: возвращает реализацию интерфейса Microsoft.AspNetCore.FileProviders.IFileProvider, которая может использоваться для чтения файлов из папки ContentRootPath

  • WebRootFileProvider: возвращает реализацию интерфейса Microsoft.AspNetCore.FileProviders.IFileProvider, которая может использоваться для чтения файлов из папки WebRootPath

При разработке мы можем использовать эти свойства. Но наиболее часто при разработке придется сталкиваться со свойством EnvironmentName. По умолчанию имеются три варианта значений для этого свойства: Development, Staging и Production. В проекте это свойство задается через установку переменной среды ASPNETCORE_ENVIRONMENT. Текущее значение данного параметра задается в файле launchSettings.json, который располагается в проекте в папке Properties.

файл launchSettings.json и переменная ASPNETCORE_ENVIRONMENT в ASP.NET Core и C#

Откроем данный файл:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:56234",
      "sslPort": 44384
    }
  },
  "profiles": {
    "HelloApp": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7256;http://localhost:5256",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Здесь можно увидеть, что переменная "ASPNETCORE_ENVIRONMENT" встречается два раза - для запуска через IISExpress и для запуска через Kestrel. В обоих случаях она имеет значение Development. Но мы можем поменять значение этой переменной.

Для определения значения этой переменной для интерфейса IWebHostEnvironment определены специальные методы расширения:

  • IsEnvironment(string envName): возвращает true, если имя среды равно значению параметра envName

  • IsDevelopment(): возвращает true, если имя среды - Development

  • IsStaging(): возвращает true, если имя среды - Staging

  • IsProduction(): возвращает true, если имя среды - Production

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

var builder = WebApplication.CreateBuilder();
WebApplication app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.Run(async (context) => await context.Response.WriteAsync("In Development Stage"));
}
else
{
    app.Run(async (context) => await context.Response.WriteAsync("In Production Stage"));
}
Console.WriteLine($"{app.Environment.EnvironmentName}");

app.Run();

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

if (context.HostingEnvironment.IsDevelopment())
{
	app.UseDeveloperExceptionPage();
}

Здесь если имя среды имеет значение "Development" (то есть приложение находится в состоянии разработки), то при ошибке разработчик увидит детальное описание ошибки. Если же приложение развернуто на хостинге и соответственно имеет другое имя хостирующей среды, то простой пользователь при ошибке ничего не увидит. Таким образом, в зависимости от стадии, на которой находится проект, мы можем скрывать или задействовать часть функционала приложения.

Если мы хотим поменять значение среды, необязательно изменять файл launchSettings.json. Это можно сделать также программно:

var builder = WebApplication.CreateBuilder();
WebApplication app = builder.Build();

app.Environment.EnvironmentName = "Production";

Определение своих состояний среды

Хотя по умолчанию среда может принимать три состояния: Development, Staging, Production, но мы можем при желании вводить новые значения. Например, нам надо отслеживать какие-то дополнительные состояния. Это можно сделать через изменение файла launchSettings.json либо программно.

Например, изменим название среды на "Test" (значение может быть произвольное):

var builder = WebApplication.CreateBuilder();
WebApplication app = builder.Build();

app.Environment.EnvironmentName = "Test";	// изменяем название среды на Test

if (app.Environment.IsEnvironment("Test")) // Если проект в состоянии "Test"
{
    app.Run(async (context) => await context.Response.WriteAsync("In Test Stage"));
}
else
{
    app.Run(async (context) => await context.Response.WriteAsync("In Development or Production Stage"));
}

app.Run();
Окружение и переменные среды в ASP.NET Core и C#

Также можно изменить значение "ASPNETCORE_ENVIRONMENT" на "Test" или любое другой в файле launchSettings.json для используемого профиля:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:56234",
      "sslPort": 44384
    }
  },
  "profiles": {
    "HelloApp": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7256;http://localhost:5256",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Test"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850