Работа с окружением в ASP.NET Core. Интерфейс IWebHostEnvironment

При разработке приложения ASP.NET Core мы можем получать и работать со сведениями об окружении в котором запускается наше приложение. Для этого используется свойство Environment класса WebApplication, которое предоставляет сведения об окружении в виде IWebHostEnvironment. Посмотрим какие свойства и методы мы можем использовать для работы с окружением.

Свойства и методы IWebHostEnvironment

Вначале рассмотрим свойства с помощью которых мы можем получить информацию об окружении:
ApplicationName Имя приложения
ContentRootFileProvider Представляет собой реализацию интерфейса IFileProvider, которая может использоваться для работы с файлами в папке путь к которой указан в свойстве ContentRootPath.
ContentRootPath Абсолютный путь к папке в которой находятся файлы содержимого приложения.
EnvironmentName Имя среды в которой запущено приложение
WebRootFileProvider
Представляет собой реализацию интерфейса IFileProvider, которая может использоваться для работы с файлами в папке, путь к которой указан в свойстве WebRootPath (по умолчанию это папка wwwroot)
WebRootPath
Абсолютный путь к папке , в которой содержатся файлы содержимого веб-приложения. По умолчанию используется вложенная папка 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 будет указывать на эту папку:

Свойство EnvironmentName и методы расширения 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 могут использоваться следующие методы расширения:

IsDevelopment() Проверяет, имеет ли текущая среда размещения имя Development.
IsEnvironment() Сравнивает имя текущей среды размещения с указанным значением.
IsProduction() Проверяет, имеет ли текущая среда размещения имя Production.
IsStaging() Проверяет, имеет ли текущая среда размещения имя 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 и проверять, например, находится ли наше приложение в состоянии тестирования, используя метод IsEnvironment:

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

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии