Содержание
При разработке приложения ASP.NET Core мы можем получать и работать со сведениями об окружении в котором запускается наше приложение. Для этого используется свойство Environment
класса WebApplication
, которое предоставляет сведения об окружении в виде IWebHostEnvironment
. Посмотрим какие свойства и методы мы можем использовать для работы с окружением.
Свойства и методы IWebHostEnvironment
Application |
Имя приложения |
Content |
Представляет собой реализацию интерфейса IFileProvider , которая может использоваться для работы с файлами в папке путь к которой указан в свойстве ContentRootPath . |
Content |
Абсолютный путь к папке в которой находятся файлы содержимого приложения. |
Environment |
Имя среды в которой запущено приложение |
Web |
Представляет собой реализацию интерфейса IFileProvider , которая может использоваться для работы с файлами в папке, путь к которой указан в свойстве WebRootPath (по умолчанию это папка wwwroot) |
Web |
Абсолютный путь к папке , в которой содержатся файлы содержимого веб-приложения. По умолчанию используется вложенная папка wwwroot . |
Посмотрим, какие значения содержат эти свойства в только что созданном пустом приложении ASP.NET Core
public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.Run(async context => { await context.Response.WriteAsync($"ApplicationName: {app.Environment.ApplicationName} \r\n"); await context.Response.WriteAsync($"ContentRootPath: {app.Environment.ContentRootPath} \r\n"); await context.Response.WriteAsync($"EnvironmentName: {app.Environment.EnvironmentName} \r\n"); await context.Response.WriteAsync($"WebRootPath: {app.Environment.WebRootPath}"); }); app.Run(); } }
В результате мы увидим следующие значения свойств:
WebRootPath
ничего не содержит. Здесь стоит немного разобраться с тем, в чем различия между двумя свойствами — ContentRootPath
и WebRootPath
Свойства ContentRootPath и WebRootPath
ContentRootPath
— это свойство, которое указывает на папку в котором содержатся файлы на которых строится приложения. Если вы запустите exe-файл приложения вне Visual Studio, то это свойство будет указывать на папку в которой находится exe-файл приложения, json-файлы с настройками. При запуске приложения в Visual Studio, например, в режиме отладки,ContentRootPath
будет указывать на папку в которой находятся исходные файлы приложения (.cs, .cproj и т.д.).WebRootPath
— это свойство, которое указывает на папку в которой размещаются файлы web-приложения (html, js, css и т.д.). Обычно — это папкаwwwroot
(хотя, при необходимости, мы можем поменять это значение на любое другое).
Так, если вы создали именно пустой (Empty) проект ASP.NET Core, то, по умолчанию в таком приложении папка wwwroot
отсутствует и, свойство WebRootPath
ничего не содержит. В обозревателе решений Visual Studio пустой проект выглядит следующим образом:
Если мы создадим в корне проекта папку с именем
wwwroot
, то Visual Studio автоматически распознает этут папку как место хранение файлов web-приложение — вы увидите, что эта папка изменит свою иконку:
Теперь, если снова запустить приложение, то свойство
WebRootPath
будет указывать на эту папку:
Свойство Environment Name и методы расширения IWebHostEnvironment
Это свойство содержит имя среды в которой запущено приложение. По умолчанию, это свойство может содержать три значения: Development
, Staging
и Production.
В проекте это свойство может задаваться через установку переменной среды ASPNETCORE_ENVIRONMENT
, а текущее значение этого свойства задается в файле launchSettings.json
, который располагается в проекте в папке Properties и по умолчанию имеет следующее содержание:
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:55935", "sslPort": 44301 } }, "profiles": { "http": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "applicationUrl": "http://localhost:5113", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "https": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "applicationUrl": "https://localhost:7228;http://localhost:5113", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
Здесь мы можем увидеть, что в фале указаны сразу три профиля запуска приложения — http, https и IIS Express. Первые два профиля используются для запуска приложения через сервер Kestrel, в третий — через IIS Express. Во всех трех случаях параметр ASPNETCORE_ENVIRONMENT
имеет значение Development
. Название среды удобно использовать в том случае, когда наше приложение должно выполнять какие-либо операции, например, в режиме разработки (Development) и не выполнять эти же операции, когда приложение полностью готово запускается пользователем (Production
).
Для проверки значения ASPNETCORE_ENVIRONMENT
могут использоваться следующие методы расширения:
Is |
Проверяет, имеет ли текущая среда размещения имя Development . |
Is |
Сравнивает имя текущей среды размещения с указанным значением. |
Is |
Проверяет, имеет ли текущая среда размещения имя Production . |
Is |
Проверяет, имеет ли текущая среда размещения имя Staging . |
Напишем следующий код приложения:
public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.Run(async context => { if (app.Environment.IsDevelopment()) { await context.Response.WriteAsync("Under construction!"); } else { await context.Response.WriteAsync("Welcome!"); } }); app.Run(); }
Здесь мы проверяем, если имя среды размещения Development, то в браузере выводится строка «Under construction!», иначе — строка «Welcome!». Теперь поменяем в launchSettings.json
, например для профиля http имя среды на Test:
Запустим наше приложение. По умолчанию профиль запуска будет https
Так как для этого профиля имя среды задано как Development, то в браузере мы увидим:
Теперь изменим профиль запуска на http и снова запустим приложение:
Так, в зависимости от имени среды мы можем менять функциональность своего приложения. При этом, если мы хотим поменять значение среды, то необязательно изменять файл launchSettings.json. Это можно сделать также программно:
app.Environment.EnvironmentName = "Test";
Приведенный выше пример работы со свойством EnvironmentName
также показывает и такую возможность, как определение своих состояний среды. Так, мы можем определить своё имя среды — Test и проверять, например, находится ли наше приложение в состоянии тестирования, используя метод Is
:
app.Environment.EnvironmentName = "Test"; app.Run(async context => { if (app.Environment.IsDevelopment()) { await context.Response.WriteAsync("Under construction!"); } else { if (app.Environment.IsEnvironment("Test")) await context.Response.WriteAsync("Testing"); else await context.Response.WriteAsync("Welcome!"); } });
Итого
Используя свойства и методы IWebHostEnvironment
мы можем взаимодействовать с некоторыми переменными окружения в котором работает наше приложение. В частности, мы можем использовать различные имена для среды в которой выполняется приложение и, в зависимости от этого, изменять функциональность приложения.