Как задать имя среды (IHostingEnvironment.EnvironmentName)?
По умолчанию ASP.NET основной веб-проект содержит такие строки в Startup.cs:
if (string.Equals(env.EnvironmentName, "Development", StringComparison.OrdinalIgnoreCase))
{
app.UseBrowserLink();
app.UseErrorPage(ErrorPageOptions.ShowAll);
}
else
{
app.UseErrorHandler("/Home/Error");
}
Как я понимаю, EnvironmentName-это новый способ обработки среды разработки/производства. Но это не меняет конфигурацию сборки выпуска. Так как же установить другой EnvironmentName?
Я могу себе представить, что он должен быть установлен в" командах " в качестве параметра для сервера.
11 ответов:
Стартовые установки.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" } } } }
После RC2
Итак, как можно задать другое имя среды?
Задайте переменную среды
Есть много способов установить эту переменную среды. К ним относятсяASPNETCORE_ENVIRONMENT.launchSettings.jsonпрофиль идругие специфические для окружающей среды способы . Вот несколько примеров.С консоли:
// PowerShell > $env:ASPNETCORE_ENVIRONMENT="Development" // Windows Command Line > SET ASPNETCORE_ENVIRONMENT=Development // Bash > ASPNETCORE_ENVIRONMENT=DevelopmentИз настроек веб-приложения Azure:
Перед RC2
Я могу представьте, что он должен быть задан в разделе "команды" в качестве параметра для сервера.
Это верно. В проекте.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". Он также поддерживает наследие ключи.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"; } }_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
Значение По Умолчанию
Значение по умолчанию - "Production" и устанавливается здесь.
Вы задаете окружение, определяя переменную окружения с именем
ASPNET_ENV. Например, если вы хотите освободитьSET ASPNET_ENV=Release.Это также может сработать, если вы передадите
ASPNET_ENV=Releaseв качестве параметра командам, но я не могу проверить это сейчас.Вот как это реализовано: https://github.com/aspnet/Hosting/blob/217f9ca3d3ccf59ea06e6555820974ba9c3b5932/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs
У меня была такая же проблема. Быть независимым от окружающей среды переменной и паутины.конфиг, который я создал .файл json как (я назвал его envsettings.json):
{ // Possible string values reported below. // - Production // - Staging // - Development "ASPNETCORE_ENVIRONMENT": "Staging" }Затем в программе.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(); } }
В 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.сеть САШ.Размещающий.json в корне вашего проекта и установите переменную ASPNET_ENV.
{ "ASPNET_ENV": "Тест" }
В
Например, в Windows вы можете выполнить эту команду на промежуточном сервере (с правами администратора)ASP.NET Core RC2имя переменной is было изменено наASPNETCORE_ENVIRONMENTSETX ASPNETCORE_ENVIRONMENT "Staging" /MЭто должно быть выполнено только один раз, и после этого сервер всегда будет считаться промежуточным сервером.
Когда вы сделаете
dotnet runв командной строке на этом сервере, вы увидитеHosting environment: Staging
Если вы предпочитаете использовать функции VS (например, VS 2017), можно добавить переменные среды на вкладке отладка свойств проекта. Например, на последнем ASP.NET основные версии (после RC2)вы должны установить переменную
ASPNETCORE_ENVIRONMENT.В результате файл
launchSettings.jsonбудет создан (или обновлен) в папке Properties соответствующего проекта, так что будет легко сохранить этот файл в вашем решении управления версиями и поделиться между разработчики (в отличие от других решений сSET/SETXкоманды)Примечание: по умолчанию последняя версия ASP.NET ядро настроило окружающую среду на производство. Таким образом, вам просто нужно установить
ASPNETCORE_ENVIRONMENTвDevelopmentв VS для целей отладки (см. скриншот выше). И конечно, если вы хотите запустить свой код локально с промежуточной средой, вы должны установитьASPNETCORE_ENVIRONMENTвStaging. И наконец, если вы хотите запустить его в рабочей среде, просто удалите эту переменную или установите значениеProduction.Подведем итоги: просто убедитесь, что развитие, 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); } } }
Если вы думаете, что откуда он берет это значение, то в данный момент он статичен и значение по умолчанию-это развитие.
Https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs
Когда вы смотрите на тип переменной IHostingEnviroment, то это Microsoft.сеть САШ.Размещающий.Хостингенвриомент.
Есть два способа, которые вы можете изменить в соответствии с динамической конфигурацией.
Вы можете реализовать Ihostingenvironment интерфейс и использовать свой собственный тип для этого. Вы можете прочитать значение из файла конфигурации.
Вы можете использовать интерфейс вы можете обновить эту переменную непосредственно здесь.
public Startup(IHostingEnvironment env) { // Setup configuration sources. Configuration = new Configuration() .AddJsonFile("config.json").AddEnvironmentVariables(); Configuration.Set("ASPNET_ENV","Your own value"); }Если вы посмотрите на сервисы в ConfigureServices, то там есть список сервисов configure по умолчанию и одним из них является IConfigureHostingEnviroment. Реализация по умолчанию является внутренним классом, поэтому вы не можете получить прямой доступ, но вы можете установить выше ключ ASPNET_ENV и он читает, что значение.
Если вам нужно установить это без изменения кода-из командной строки в корне исходной папки проекта введите:
set ASPNET_ENV=Debug
В VsCode добавьте следующий запуск.json
{ "version": "0.2.0", "configurations": [ { ... "env": { "ASPNETCORE_ENVIRONMENT": "Development" } }, ... ] }
Вот Еще один способ задать и переменную ASPNETCORE_ENVIRONMENT в VS2017 (дополнительная заметка к ответу @clark-wu):
Примечание: 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 любое значение, но фреймворк поддерживает три значения: Development, Staging и Production. Если параметр ASPNETCORE_ENVIRONMENT не задан, по умолчанию используется значение Production.



Comments