Подтвердить что ты не робот

Как установить имя среды (IHostingEnvironment.EnvironmentName)?

Веб-проект ASP.NET Core по умолчанию содержит следующие строки в Startup.cs:

if (string.Equals(env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
{
    app.UseBrowserLink();
    app.UseDeveloperExceptionPage(ErrorPageOptions.ShowAll);
}
else
{
    app.UseExceptionHandler("/Home/Error");
}

Как я понимаю, EnvironmentName - это новый способ обработки среды разработки и производства. Но это не изменится в конфигурации сборки выпуска. Так как же установить другое EnvironmentName?

Я могу себе представить, что он должен быть установлен в "Команды" в качестве параметра для сервера.

4b9b3361

Ответ 1

launchsettings.json

В свойствах > launchsettings.json

Точно так же:

    {
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:1032/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      }
    },
    "WebAppNetCore": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "web": {
      "commandName": "web",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Ответ 2

После RC2

Итак, каков способ установить другое имя среды?

Установите переменную окружения ASPNETCORE_ENVIRONMENT.

Существует множество способов установить эту переменную окружения. К ним относятся профиль launchSettings.json и другие связанные с окружающей средой способы. Вот несколько примеров.

На консоли:

// PowerShell
> $env:ASPNETCORE_ENVIRONMENT="Development"

// Windows Command Line
> SET ASPNETCORE_ENVIRONMENT=Development

// Bash
> ASPNETCORE_ENVIRONMENT=Development

Из настроек приложения Azure Web App:

Установить имя среды в Azure

Перед RC2

Я могу представить, что он должен быть установлен в "Команды" в качестве параметра для сервера.

Это верно. В файле project.json добавьте --ASPNET_ENV production в качестве параметра для сервера.

"commands": {
  "web": "Microsoft.AspNet.Hosting --ASPNET_ENV production --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001"
}

Теперь, когда вы запускаете dnx . web из командной строки, ASPNET_ENV будет production.

Соответствующий исходный код основного хостинга ASP.NET

WebHostBuilder объединяет "ASPNETCORE_" с WebHostDefaults.EnvironmentKey, чтобы сделать "ASPNETCORE_environment". Он также поддерживает устаревшие ключи.

WebHostDefaults.cs

namespace Microsoft.AspNetCore.Hosting
{
    public static class WebHostDefaults
    {
        public static readonly string ApplicationKey = "applicationName";
        public static readonly string StartupAssemblyKey = "startupAssembly";

        public static readonly string DetailedErrorsKey = "detailedErrors";
        public static readonly string EnvironmentKey = "environment";
        public static readonly string WebRootKey = "webroot";
        public static readonly string CaptureStartupErrorsKey = "captureStartupErrors";
        public static readonly string ServerUrlsKey = "urls";
        public static readonly string ContentRootKey = "contentRoot";
    }
}

WebHostBuilder.cs

_config = new ConfigurationBuilder()
    .AddEnvironmentVariables(prefix: "ASPNETCORE_")
    .Build();

if (string.IsNullOrEmpty(GetSetting(WebHostDefaults.EnvironmentKey)))
{
    // Try adding legacy environment keys, never remove these.
    UseSetting(WebHostDefaults.EnvironmentKey, 
        Environment.GetEnvironmentVariable("Hosting:Environment") 
        ?? Environment.GetEnvironmentVariable("ASPNET_ENV"));
}

Обратная совместимость

Ключ среды устанавливается с переменной среды ASPNETCORE_ENVIRONMENT. ASPNET_ENV и Hosting:Environment по-прежнему поддерживаются, но генерируют предупреждение с устаревшим сообщением.

https://docs.asp.net/en/latest/migration/rc1-to-rtm.html

Значение по умолчанию

Значение по умолчанию - "Производство" и установлено здесь.

Ответ 3

Вы устанавливаете среду, определяя переменную среды с именем ASPNET_ENV. Например, если вы хотите Release SET ASPNET_ENV=Release.

Он также может работать, если вы передадите ASPNET_ENV=Release в качестве параметра в команды, но я не могу проверить его сейчас.

Вот как это реализовано: https://github.com/aspnet/Hosting/blob/217f9ca3d3ccf59ea06e6555820974ba9c3b5932/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs

Ответ 4

У меня была такая же проблема. Чтобы быть независимым от переменной окружения и web.config, я создал файл .json как (я назвал его envsettings.json):

{
  // Possible string values reported below.
  // - Production
  // - Staging
  // - Development
  "ASPNETCORE_ENVIRONMENT": "Staging"
}

Затем в Program.cs я добавил:

public class Program
{
    public static void Main(string[] args)
    {
        var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();

        var webHostBuilder = new WebHostBuilder()
            .UseKestrel()
            .CaptureStartupErrors(true)
            .UseSetting("detailedErrors", "true")
            .UseContentRoot(currentDirectoryPath)
            .UseIISIntegration()
            .UseStartup<Startup>();

        // If none is set it use Operative System hosting enviroment
        if (!string.IsNullOrWhiteSpace(enviromentValue)) 
        {
            webHostBuilder.UseEnvironment(enviromentValue);
        }

        var host = webHostBuilder.Build();

        host.Run();
    }
}

Ответ 5

Если вы предпочитаете использовать функции VS (например, VS 2017), можно добавить переменные среды на вкладке "Отладка" свойств проекта. Например, в последних версиях ASP.NET Core (после RC2) вы должны установить переменную ASPNETCORE_ENVIRONMENT.

введите описание изображения здесь

В результате файл launchSettings.json будет создан (или обновлен) в папке "Свойства" соответствующего проекта, поэтому будет легко сохранить этот файл в вашем исходном контрольном решении и поделиться между разработчиками (как в отличие от других решения с командами SET/SETX)

Примечание. По умолчанию последний ASP.NET Core устанавливает среду в Production. Таким образом, вам просто нужно установить ASPNETCORE_ENVIRONMENT в Development в VS для целей отладки (см. Скриншот выше). И конечно, если вы хотите запустить свой код локально с помощью среды Staging, вы должны установить ASPNETCORE_ENVIRONMENT в Staging. И, наконец, когда вы хотите запустить его в рабочей среде, просто удалите эту переменную или установите значение Production.

Подводя итог: просто убедитесь, что значения Development, Staging или Production используются (а не "Dev" или что-то еще) в диалоговом окне "Отладка" для настройки среды и создания разных расширений.

См. также соответствующий исходный код из ядра ASP.NET:

namespace Microsoft.AspNetCore.Hosting
{
  /// <summary>Commonly used environment names.</summary>
  public static class EnvironmentName
  {
    public static readonly string Development = "Development";
    public static readonly string Staging = "Staging";
    public static readonly string Production = "Production";
  }
}

namespace Microsoft.AspNetCore.Hosting
{
  /// <summary>
  /// Extension methods for <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.
  /// </summary>
  public static class HostingEnvironmentExtensions
  {
    /// <summary>
    /// Checks if the current hosting environment name is "Development".
    /// </summary>
    /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param>
    /// <returns>True if the environment name is "Development", otherwise false.</returns>
    public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment)
    {
      if (hostingEnvironment == null)
        throw new ArgumentNullException("hostingEnvironment");
      return hostingEnvironment.IsEnvironment(EnvironmentName.Development);
    }

    /// <summary>
    /// Checks if the current hosting environment name is "Staging".
    /// </summary>
    /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param>
    /// <returns>True if the environment name is "Staging", otherwise false.</returns>
    public static bool IsStaging(this IHostingEnvironment hostingEnvironment)
    {
      if (hostingEnvironment == null)
        throw new ArgumentNullException("hostingEnvironment");
      return hostingEnvironment.IsEnvironment(EnvironmentName.Staging);
    }

    /// <summary>
    /// Checks if the current hosting environment name is "Production".
    /// </summary>
    /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param>
    /// <returns>True if the environment name is "Production", otherwise false.</returns>
    public static bool IsProduction(this IHostingEnvironment hostingEnvironment)
    {
      if (hostingEnvironment == null)
        throw new ArgumentNullException("hostingEnvironment");
      return hostingEnvironment.IsEnvironment(EnvironmentName.Production);
    }

    /// <summary>
    /// Compares the current hosting environment name against the specified value.
    /// </summary>
    /// <param name="hostingEnvironment">An instance of <see cref="T:Microsoft.AspNetCore.Hosting.IHostingEnvironment" />.</param>
    /// <param name="environmentName">Environment name to validate against.</param>
    /// <returns>True if the specified name is the same as the current environment, otherwise false.</returns>
    public static bool IsEnvironment(this IHostingEnvironment hostingEnvironment, string environmentName)
    {
      if (hostingEnvironment == null)
        throw new ArgumentNullException("hostingEnvironment");
      return string.Equals(hostingEnvironment.EnvironmentName, environmentName, StringComparison.OrdinalIgnoreCase);
    }
  }
}

Ответ 6

Если вы думаете, что откуда он принимает это значение, то в качестве этого момента он статичен, а значение по умолчанию - это развитие.

https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs

Когда вы смотрите на тип переменной IHostingEnviroment, то это Microsoft.AspNet.Hosting.HostingEnvrioment.

Теперь вы можете изменить два способа изменения динамической конфигурации.

  • Вы можете реализовать интерфейс IHostingEnvironment и использовать для этого свой собственный тип. Вы можете прочитать значение из файла Config.

  • Вы можете использовать интерфейс. Вы можете обновить эту переменную непосредственно здесь.

    public Startup(IHostingEnvironment env)
    {
    // Setup configuration sources.
    Configuration = new Configuration()
        .AddJsonFile("config.json").AddEnvironmentVariables();
    
    Configuration.Set("ASPNET_ENV","Your own value");    
    }
    

    Если вы посмотрите на службы в ConfigureServices, по умолчанию настроен список настроек службы, а один из них - IConfigureHostingEnviroment. Реализация по умолчанию - это внутренний класс, поэтому вы не можете напрямую обращаться, но вы можете установить выше ключ ASPNET_ENV и прочитать это значение.

https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs

Ответ 7

  • На Azure просто установите переменную среды ASPNET_ENV на странице конфигурации веб-приложения.

  • С вашим собственным IIS или другими хостинг-провайдерами - измените web.config, чтобы включить аргументы для команды "web":

    <configuration>
     <system.webServer>
      <handlers>
        <add name="httpplatformhandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
      </handlers>
      <httpPlatform processPath="..\approot\web.cmd" arguments="--ASPNET_ENV Development" stdoutLogEnabled="false" stdoutLogFile="..\logs\stdout.log" startupTimeLimit="3600"></httpPlatform>
     </system.webServer>
    </configuration>
    
  • Во время разработки (если вы можете изменить исходный код) вы также можете создать файл с именем Microsoft.AspNet.Hosting.json в корневом каталоге вашего проекта и установить переменную ASPNET_ENV.

    { "ASPNET_ENV": "Тест" }

Ответ 8

В ASP.NET Core RC2 имя переменной было изменено на ASPNETCORE_ENVIRONMENT

например. В Windows вы можете выполнить эту команду на промежуточном сервере (с правами администратора)

SETX ASPNETCORE_ENVIRONMENT "Staging" /M

Это будет выполнено только один раз и после этого сервер всегда будет считаться промежуточным сервером.

Когда вы выполните dotnet run в командной строке на этом сервере, вы увидите Hosting environment: Staging

Ответ 9

если вам нужно установить это без изменения кода - из командной строки в корневом каталоге исходной папки проекта:

set ASPNET_ENV=Debug

Ответ 10

В VsCode добавьте следующее к launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            ...
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development"
            }
        },
        ...
    ]
}

Ответ 11

Вот еще один способ установить и переключить переменную ASPNETCORE_ENVIRONMENT в VS2017 (примечание к ответу @clark-wu):

enter image description here

Примечание. В моем случае launchSettings.json имеет два профиля: "IISExpress" и "Project", в которых определено ASPNETCORE_ENVIRONMENT.

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:10000/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "api/entities",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development" // <-- related to IIS Express profile
      }
    },
    "Project": {
      "commandName": "Project",
      "launchBrowser": true,
      "launchUrl": "api/entities",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production" // <-- related to Project profile
      },
      "applicationUrl": "http://localhost:10000/"
    }
  }
}

Официальная документация: для ASPNETCORE_ENVIRONMENT можно установить любое значение, но платформа поддерживает три значения: разработка, подготовка и производство. Если ASPNETCORE_ENVIRONMENT не установлен, по умолчанию используется Production.