Публикация в IIS, установка переменной среды
чтение этих двух вопросов / ответов, которые я смог запустить Asp.net 5 приложение на сервере IIS 8.5.
Asp.net ранняя бета-версия vNext публикуется в IIS в windows server
как настроить приложение MVC6 для работы с IIS?
проблема в том, что веб-приложение по-прежнему использует env.EnvironmentName
со значением Development
даже при запуске в IIS.
кроме того, я хочу запустить две версии одного и того же веб-сайта (промежуточный, производственный) на одном сервере, поэтому я нужен метод, чтобы установить переменную для каждого Web отдельно.
Как это сделать?
11 ответов
этот ответ был первоначально написан для ASP.NET ядро RC1. В RC2 ASP.NET ядро переместилось из универсального обработчика httpPlafrom в aspnetCore. Обратите внимание, что Шаг 3 зависит от того, какая версия ASP.NET ядро, которое вы используете.
оказывается, переменные среды для ASP.NET основные проекты могут быть установлены без необходимости устанавливать переменные среды для пользователя или создавать несколько записей команд.
- перейдите в приложение в IIS и выберите
Configuration Editor
. - выберите
Configuration Editor
- выбрать
system.webServer/aspNetCore
(RC2 и RTM) илиsystem.webServer/httpPlatform
(RC1) вSection
combobox - выбрать
Applicationhost.config ...
наFrom
combobox. - нажать на кнопку
enviromentVariables
элемент и открыть окно редактирования. - установите переменные среды.
- закройте окно и нажмите кнопку Применить.
- сделал
таким образом, вам не нужно создавать специальных пользователей для вашего пула или создавать дополнительные команды записи в project.json
.
Кроме того, добавление специальных команд для каждой среды прерывает "build once, deploy many times", поскольку вам придется вызвать dnu publish
отдельно для каждой среды, вместо публикации один раз и развертывания результирующего артефакта много раз.
обновлено для RC2 и RTM, благодаря Mark G и tredder.
обновлено для RTM и RC2
обновление web.config С
<configuration>
<system.webServer>
<aspNetCore .....>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
или во избежание потери этой настройки при перезаписи web.config, внесите аналогичные изменения в applicationHost.config указание местоположения сайта, как предлагает @NickAb.
<location path="staging.site.com">
<system.webServer>
<aspNetCore>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
<location path="production.site.com">
<system.webServer>
<aspNetCore>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Production" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</location>
Edit: начиная с выпусков RC2 и RTM, этот совет устарел. Лучший способ, который я нашел для этого в выпуске, - это отредактировать следующий веб-сайт.разделы конфигурации в IIS для каждой среды:
system.webServer/aspNetCore
:
изменить запись в переменную окружения и добавить переменную среды установка:
ASPNETCORE_ENVIRONMENT
: < Your environment name >
в качестве альтернативы подходу drpdrp, вы можете сделать следующий:
- в вашем проекте.json, добавьте команды, которые передают переменную ASPNET_ENV непосредственно в Kestrel:
"commands": {
"Development": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Development",
"Staging": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Staging",
"Production": "Microsoft.AspNet.Server.Kestrel --ASPNET_ENV Production"
}
- при публикации, используйте
--iis-command
возможность указать среду:
dnu publish --configuration Debug --iis-command Staging --out "outputdir" --runtime dnx-clr-win-x86-1.0.0-rc1-update1
Я нашел этот подход менее навязчивым, чем создание дополнительных пользователей IIS.
после обширного поиска в гугле я нашел рабочее решение, которое состоит из двух шагов.
первый шаг-установить системную переменную среды ASPNET_ENV в Production и перезапустите сервер Windows. После этого все веб-приложения получают значение "Production" как EnvironmentName.
второй шаг (для включения значения "Staging" для staging web) был довольно сложным для правильной работы, но вот он:
- создать новый пользователь windows, например StagingPool на сервере.
- для этого пользователя создайте новую пользовательскую переменную ASPNETCORE_ENVIRONMENT со значением "Staging" (вы можете сделать это, войдя в систему как этот пользователь или через regedit)
- назад в качестве администратора в диспетчере IIS найдите пул приложений, под которым работает промежуточный веб-сайт, и в расширенных настройках установите Identity в user StagingPool.
- и набор Загрузить Профиль Пользователя для правда, поэтому переменные среды загружаются. - очень важно!
- обеспечить StagingPool имеет права доступа к веб-папке и остановки и запуска пула приложений.
теперь промежуточный веб должен иметь EnvironmentName значение "промежуточный".
Обновление: В Windows 7+ есть команда это может установить переменные среды из приглашения CMD также для указанного пользователя. Это выходы help plus образцы:
>setx /?
у меня есть мои веб-приложения (производство, постановка, тест), размещенные на веб-сервере IIS. Поэтому было невозможно полагаться на системную переменную среды ASPNETCORE_ENVIRONMENT operative, поскольку установка ее на определенное значение (например, STAGING) влияет на другие приложения.
в качестве обходного пути я определил пользовательский файл (envsettings.json) в моем решении visualstudio:
с последующим содержание:
{
// Possible string values reported below. When empty it use ENV variable value or Visual Studio setting.
// - Production
// - Staging
// - Test
// - Development
"ASPNETCORE_ENVIRONMENT": ""
}
затем, основываясь на моем типе приложения (производство, постановка или тест), я устанавливаю этот файл согласованно: предположим, я развертываю тестовое приложение, у меня будет:
"ASPNETCORE_ENVIRONMENT": "Test"
после этого, в программу.cs-файл просто извлекает это значение, а затем устанавливает среду webHostBuilder:
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();
}
}
Не забудьте включить envsettings.json в publishOptions (project.в JSON):
"publishOptions":
{
"include":
[
"wwwroot",
"Views",
"Areas/**/Views",
"envsettings.json",
"appsettings.json",
"appsettings*.json",
"web.config"
]
},
это решение делает меня свободным иметь ASP.NET Керн приложение, размещенное на том же IIS, независимо от значения переменной envoroment.
чтобы расширить ответ @tredder, вы можете изменить environmentVariables, используя 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
@tredder решение с редактированием applicationHost.config - Это тот, который работает, если у вас есть несколько разных приложений, расположенных в виртуальных каталогах IIS.
мой случай:
- у меня есть API и APP проект, под тем же доменом, размещенный в разных виртуальных каталогах
- корневую страницу XXX похоже, не распространяет переменную ASPNETCORE_ENVIRONMENT на своих потомков в виртуальных каталогах и...
- ...Я не могу установить переменные внутри виртуального каталога, как описано в @NickAb (получена ошибка запрос не поддерживается. (Исключение из HRESULT: 0x80070032) при сохранении изменений в Редакторе конфигурации):
-
зайдя в 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_
. - если вы хотите сопоставить дочерние узлы в конфигурации JSON, используйте
:
в качестве разделителя. Если платформа не разрешает двоеточия в ключах переменных среды, используйте__
вместо. - вы хотите, чтобы ваши настройки в
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
для левой фигурной скобкой.- чтобы перечислить текущие настройки (в сочетании со значениями из интернета.config):
%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
.
чтобы получить подробную информацию об ошибке, я должен был добавить ASPNETCORE_ENVIRONMENT
переменные среды для соответствующего пула приложений system.applicationHost/applicationPools
.
Примечание: веб-приложение, в моем случае был ASP.NET Core 2
веб-приложение, размещенное на IIS 10
. Это можно сделать через Configuration Editor
на IIS Manager
(см. редактирование коллекций с помощью редактора конфигурации выяснить, где найти этот редактор в IIS Manager
).
Я создал репозиторий для публикации IIS с конфигурацией среды в Интернете.конфиг.
https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment
- получи участках .csproj и .пользователь.файлы csproj в файлы проекта.
- получить MyAspNetEnvironment.реквизит, паутина.развитие.config и web.производство.конфигурационный файл.
- измените значение свойства ASPNETCORE_ENVIRONMENT в пользователь.csproj файл соответственно.
на github есть хорошо документированный инструмент для тип xdt-преобразования. Также это не зависит от команды, как dotnet publish, так и dotnet msbuild отлично работает.
вы должны создать другую сеть.файлы конфигурации веб.отлаживать.cofig, web.освобождать.config etc. На основе этого вы можете легко установить свою собственную переменную среды.