Содержание
При разработке приложения 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 мы можем взаимодействовать с некоторыми переменными окружения в котором работает наше приложение. В частности, мы можем использовать различные имена для среды в которой выполняется приложение и, в зависимости от этого, изменять функциональность приложения.





