Прочитав эти два вопроса / ответа, я смог запустить приложение Asp.net 5 на сервере IIS 8.5.
Asp.net vNext: ранняя бета-версия публикации в IIS на сервере Windows
Как настроить приложение MVC6 для работы в IIS?
Проблема в том, что веб-приложение по-прежнему использует env.EnvironmentName
значение Development
даже при запуске в IIS.
Кроме того, я хочу запустить две версии одной и той же сети (Staging, Production) на одном сервере, поэтому мне нужен метод для установки переменной для каждой сети отдельно.
Как это сделать?
Properties\launchSettings.json
для моделирования другой среды для отладки в Visual Studio.Ответы:
Этот ответ изначально был написан для ASP.NET Core RC1. В RC2 ASP.NET Core перешел с универсального обработчика httpPlafrom на специальный обработчик aspnetCore. Обратите внимание, что шаг 3 зависит от того, какую версию ASP.NET Core вы используете.
Оказывается, переменные среды для проектов ASP.NET Core можно устанавливать без необходимости устанавливать переменные среды для пользователя или создавать несколько записей команд.
Configuration Editor
.Configuration Editor
system.webServer/aspNetCore
(RC2 и RTM) илиsystem.webServer/httpPlatform
(RC1) вSection
поле со спискомApplicationhost.config ...
вFrom
поле со списком.enviromentVariables
элемент правой кнопкой мыши , выберите'environmentVariables' element
, затемEdit Items
.Таким образом, вам не нужно создавать специальных пользователей для вашего пула или создавать дополнительные записи команд в
project.json
. Кроме того, добавление специальных команд для каждой среды прерывает «сборку один раз, развертывание много раз», так как вам придется вызыватьdnu publish
отдельно для каждой среды вместо того, чтобы публиковать один раз и развертывать результирующий артефакт много раз.Обновлено для RC2 и RTM благодаря Mark G и треддеру.
источник
system.webServer/aspNetCore
вместо этого.Обновление web.config с <EnvironmentVariables> раздел под <aspNetCore>
Или, чтобы не потерять этот параметр при перезаписи web.config, внесите аналогичные изменения в applicationHost.config, указав расположение сайта, как предлагает @NickAb.
источник
Target configuration object '/system.webServer/aspNetCore/environmentVariables/environmentVariable is not found ...
Обычно, чтобы установить некоторую переменную, я бы написал что-то вроде этого:Set-WebConfigurationProperty -PSPath IIS:\ -location example.com -filter /system.webServer/aspNetCore/environmentVariables/environmentVariable -name ASPNETCORE_ENVIRONMENT -value Staging
что мне не хватает?appcmd
вместо этого.Set-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
Изменить: в выпусках RC2 и RTM этот совет устарел. Лучший способ, который я нашел для этого в выпуске, - это отредактировать следующие разделы web.config в IIS для каждой среды:
system.webServer/aspNetCore
:Отредактируйте запись environmentVariable и добавьте настройку переменной среды:
ASPNETCORE_ENVIRONMENT
:< Your environment name >
В качестве альтернативы подходу drpdrp вы можете сделать следующее:
Добавьте в свой project.json команды, которые передают переменную ASPNET_ENV непосредственно в Kestrel:
При публикации используйте
--iis-command
параметр, чтобы указать среду:Я обнаружил, что этот подход менее навязчив, чем создание дополнительных пользователей IIS.
источник
Мои веб-приложения (ПРОИЗВОДСТВО, ЭТАП, ТЕСТ) размещены на веб-сервере IIS. Таким образом, было невозможно полагаться на системную переменную среды оператора ASPNETCORE_ENVIRONMENT, потому что установка для нее определенного значения (например, STAGING) влияет на другие приложения.
В качестве обходного пути я определил собственный файл (envsettings.json) в моем решении visualstudio:
со следующим содержанием:
Затем, в зависимости от типа моего приложения (производственное, промежуточное или тестовое), я устанавливаю этот файл соответствующим образом: предположим, что я развертываю тестовое приложение, у меня будет:
После этого в файле Program.cs просто получите это значение, а затем установите среду webHostBuilder:
Не забудьте включить envsettings.json в publishOptions (project.json):
Это решение позволяет мне размещать приложение ASP.NET CORE на одном и том же IIS, независимо от значения переменной окружения.
источник
После обширного поиска в Google я нашел рабочее решение, которое состоит из двух шагов.
Первый шаг - установить общесистемную переменную среды ASPNET_ENV в значение «Производство» и перезапустить Windows Server. . После этого все веб-приложения получают значение «Производство» как EnvironmentName.
На втором этапе (чтобы включить значение Staging для промежуточной сети) было труднее заставить работать правильно, но вот оно:
Теперь в промежуточной сети для EnvironmentName должно быть установлено значение «Staging».
Обновление: в Windows 7+ есть команда, которая может устанавливать переменные среды из командной строки CMD также для указанного пользователя. Это выводит справку плюс образцы:
источник
В качестве альтернативы вы можете передать желаемое
ASPNETCORE_ENVIRONMENT
в команду публикации dotnet в качестве аргумента, используя:например:
Это сгенерирует web.config с правильной средой, указанной для вашего проекта:
источник
Помимо упомянутых выше вариантов, есть несколько других решений, которые хорошо работают с автоматическим развертыванием или требуют меньшего количества изменений конфигурации.
1. Изменение файла проекта (.CsProj).
MSBuild поддерживает
EnvironmentName
свойство, которое может помочь установить правильную переменную среды в соответствии со средой, которую вы хотите развернуть. Имя среды будет добавлено в web.config на этапе публикации.Просто откройте файл проекта (* .csProj) и добавьте следующий XML.
В приведенном выше коде будет добавлено имя среды, как
Development
для конфигурации отладки, или если конфигурация не указана. Для любой другой конфигурации имя среды будетProduction
в сгенерированном файле web.config. Подробнее здесь2. Добавление свойства EnvironmentName в профили публикации.
Мы также можем добавить
<EnvironmentName>
свойство в профиль публикации. Откройте файл профиля публикации, который находится в папке.Properties/PublishProfiles/{profilename.pubxml}
Это установит имя среды в web.config при публикации проекта. Подробнее здесь3. Параметры командной строки с использованием dotnet publish
Кроме того, мы можем передать свойство
EnvironmentName
как параметр командной строкиdotnet publish
команде. Следующая команда будет включать переменную среды, какDevelopment
в файле web.config.dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
источник
Чтобы расширить ответ @tredder, вы можете изменить переменные среды, используя
appcmd
инсценировка
%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST
производство
%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST
источник
Что нужно знать в одном месте:
ASPNETCORE_
.:
в качестве разделителя. Если платформа не допускает двоеточия в ключах переменных среды, используйте__
вместо них.ApplicationHost.config
. Использование редактора конфигурации IIS приведет к тому, что ваши входные данные будут записаны в приложениеWeb.config
- и будут перезаписаны при следующем развертывании!Для изменения
ApplicationHost.config
вы хотите использовать,appcmd.exe
чтобы убедиться, что ваши изменения согласованы. Пример:%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /+"environmentVariables.[name='ASPNETCORE_AWS:Region',value='eu-central-1']" /commit:site
Символы, которые не являются безопасными для URL, могут быть экранированы как Unicode, например,
%u007b
для левой фигурной скобки.%systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
%systemroot%\system32\inetsrv\appcmd.exe set config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore /-"environmentVariables.[name='ASPNETCORE_MyKey',value='value-to-be-removed']" /commit:site
.источник
/commit:site
изменения записаны в web.config, для того, чтобы сохранить их вApplicationHost.config
одном следует использовать/commit:apphost
-section:system.webServer/aspNetCore /-"environmentVariables.
(с минусом для удаления переменной среды) не выполняется во время конвейера выпуска Azure. Ошибка естьhresult:80070032, message:Command execution failed
. Однакоclear config "Default Web Site/$(webSiteName)" -section:system.webServer/aspNetCore /commit:site
работает нормально. Он очищает весь раздел aspNetCore для веб-сайта, но это не проблема, так как он параметризуется во время выпуска.Как и в других ответах, я хотел убедиться, что мой параметр среды ASP.NET Core 2.1 сохранялся во всех развертываниях, но также применялся только к определенному сайту.
Согласно документации Microsoft, можно установить переменную среды в пуле приложений, используя следующую команду PowerShell в IIS 10:
К сожалению, мне все еще приходится использовать IIS 8.5, и я подумал, что мне не повезло. Тем не менее, по-прежнему можно запустить простой сценарий PowerShell, чтобы установить значение переменной среды для конкретного сайта для ASPNETCORE_ENVIRONMENT:
источник
Решение @tredder с редактированием applicationHost.config - это то, что работает, если у вас есть несколько разных приложений, расположенных в виртуальных каталогах на IIS.
Мой случай:
Заходим в applicationHost.config и вручную создаем такие узлы:
<location path="XXX/app"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location> <location path="XXX/api"> <system.webServer> <aspNetCore> <environmentVariables> <clear /> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" /> </environmentVariables> </aspNetCore> </system.webServer> </location>
и перезапуск IIS выполнил свою работу.
источник
Чтобы получить подробную информацию об ошибке, мне пришлось добавить
ASPNETCORE_ENVIRONMENT
переменную среды для соответствующего пула приложенийsystem.applicationHost/applicationPools
.Примечание: в моем случае
ASP.NET Core 2
веб-приложение было размещено на сервереIIS 10
. Это можно сделать черезConfiguration Editor
inIIS Manager
(см. Редактирование коллекций с помощью редактора конфигурации, чтобы выяснить, где найти этот редакторIIS Manager
).источник
Я создал репозиторий для публикации IIS с конфигурацией среды в Web.config.
https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment
источник
Я изменил ответ, который дан @Christian Del Bianco . Я изменил процесс для .net core 2 и выше, поскольку теперь файл project.json является абсолютным.
Сначала создайте файл appsettings.json в корневом каталоге. с содержанием
Затем создайте еще два файла настроек appsettings.Development.json и appsettings.Production.json с необходимой конфигурацией.
Добавьте необходимый код для настройки среды в файл Program.cs .
}
Добавьте envsettings.json в свой .csproj файл для копирования в опубликованный каталог.
Теперь просто измените ASPNETCORE_ENVIRONMENT, как хотите, в файле envsettings.json и опубликуйте.
источник