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

Публикация в IIS, установка переменной среды

Чтение этих двух вопросов/ответов Я смог запустить приложение Asp.net 5 на сервере IIS 8.5.

Asp.net vNext ранняя бета публикует в IIS на сервере Windows

Как настроить приложение MVC6 для работы с IIS?

Проблема в том, что веб-приложение по-прежнему использует env.EnvironmentName со значением Development даже при работе в IIS.

Кроме того, я хочу запустить две версии одного и того же Web (Staging, Production) на том же сервере, поэтому мне нужен метод для установки переменной для каждого веб-сайта отдельно.

Как это сделать?

4b9b3361

Ответ 1

Этот ответ был изначально написан для ASP.NET Core RC1. В RC2 ASP.NET Core перешел от общего обработчика httpPlafrom к специфическому для aspnetCore. Обратите внимание, что шаг 3 зависит от того, какую версию ASP.NET Core вы используете.

Оказывается, переменные среды для проектов ASP.NET Core могут быть установлены без необходимости устанавливать переменные среды для пользователя или создавать несколько записей команд.

  1. Перейдите к своему приложению в IIS и выберите Configuration Editor.
  2. Выберите Configuration Editor
  3. Выберите system.webServer/aspNetCore (RC2 и RTM) или system.webServer/httpPlatform (RC1) в комбинированном списке Section
  4. Выберите Applicationhost.config ... в выпадающем списке From.
  5. Щелкните правой кнопкой мыши элемент enviromentVariables, выберите 'environmentVariables' element, затем Edit Items. enter image description here
  6. Установите переменные среды.
  7. Закройте окно и нажмите "Применить".
  8. Совершено

Таким образом, вам не нужно создавать специальных пользователей для вашего пула или создавать дополнительные записи команд в project.json. Кроме того, добавление специальных команд для каждой среды нарушает "строить один раз, многократно развертывать", так как вам придется вызывать dnu publish отдельно для каждой среды, вместо того, чтобы публиковать один раз и многократно развертывать полученный артефакт.

Обновлен для RC2 и RTM, благодаря Mark G и Tredder.

Ответ 2

Обновите файл web.config с разделом <environmentVariables> в разделе <aspNetCore>

<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>

Ответ 3

Редактировать: в версиях RC2 и RTM этот совет устарел. Лучший способ сделать это в выпуске - отредактировать следующие разделы web.config в IIS для каждой среды:

system.webServer/aspNetCore:

Отредактируйте запись environmentVariable и добавьте параметр переменной среды:

ASPNETCORE_ENVIRONMENT: < Your environment name >


В качестве альтернативы подходу drpdrp вы можете сделать следующее:

  • В вашем project.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.

Ответ 4

После интенсивного поиска в Google я нашел рабочее решение, которое состоит из двух шагов.

Первый шаг - установить общесистемную переменную среды ASPNET_ENV в производственную и перезапустить Windows Server. После этого все веб-приложения получают значение "Production" в качестве EnvironmentName.

Второй шаг (для включения значения 'Staging' для промежуточной сети) было довольно сложно заставить работать правильно, но вот он:

  1. Создайте нового пользователя Windows, например StagingPool на сервере.
  2. Для этого пользователя создайте новую переменную пользователя ASPNETCORE_ENVIRONMENT со значением 'Staging' (вы можете сделать это, войдя в систему как этот пользователь или через regedit)
  3. Вернувшись в качестве администратора в диспетчере IIS, найдите пул приложений, в котором запущена промежуточная сеть, и в разделе "Дополнительные параметры" установите для удостоверения пользователя StagingPool.
  4. Также установите для Load User Profile значение true, чтобы переменные среды загружались. <- очень важно!
  5. Убедитесь, что StagingPool имеет права доступа к веб-папке, а также остановите и запустите пул приложений.

Теперь в Staging web должно быть установлено EnvironmentName "Staging".

Обновление: в Windows 7+ есть команда, которая может устанавливать переменные среды из приглашения CMD также для указанного пользователя. Эти выводы помогают плюс образцы:

>setx /?

Ответ 5

У меня есть веб-приложения (ПРОИЗВОДСТВО, СТАРТ, ТЕСТ), размещенные на веб-сервере IIS. Таким образом, было невозможно полагаться на переменную среды жизнеобеспечения ASPNETCORE_ENVIRONMENT, поскольку установка ее на определенное значение (например, 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": ""
}

Затем, основываясь на моем типе приложения (Production, Staging или Test), я устанавливаю этот файл следующим образом: предположим, что я развертываю приложение TEST, у меня будет:

"ASPNETCORE_ENVIRONMENT": "Test"

После этого в файле Program.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 CORE, размещенное на одном и том же IIS, независимо от значения переменной envoroment.

Ответ 6

Чтобы расширить ответ на @tredder, вы можете изменить переменные среды, используя appcmd

Staging

%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

Ответ 7

В качестве альтернативы вы можете передать желаемый ASPNETCORE_ENVIRONMENT в команду публикации dotnet в качестве аргумента, используя:

/p:EnvironmentName=Staging

например:

dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging

Это сгенерирует файл web.config с правильной средой, указанной для вашего проекта:

<environmentVariables>
  <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>

Ответ 8

Что нужно знать в одном месте:

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

  • Чтобы получить список текущих настроек (в сочетании со значениями из Web.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.

Ответ 9

Решение @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 выполнил задание.

Ответ 10

Помимо упомянутых выше вариантов, есть несколько других решений, которые хорошо работают с автоматическими развертываниями или требуют меньше изменений конфигурации.

1. Изменение файла проекта (.CsProj)

MSBuild поддерживает свойство EnvironmentName, которое может помочь установить правильную переменную среды в соответствии с той средой, которую вы хотите развернуть. Имя среды будет добавлено в файл web.config на этапе публикации.

Просто откройте файл проекта (*.csProj) и добавьте следующий XML.

<!-- Custom Property Group added to add the Environment name during publish
  The EnvironmentName property is used during the publish for the Environment variable in web.config
  -->
  <PropertyGroup Condition=" '$(Configuration)' == '' Or '$(Configuration)' == 'Debug'">
    <EnvironmentName>Development</EnvironmentName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)' != '' AND '$(Configuration)' != 'Debug' ">
    <EnvironmentName>Production</EnvironmentName>
  </PropertyGroup>

Вышеупомянутый код добавляет имя среды как Development для конфигурации отладки или, если конфигурация не указана. Для любой другой конфигурации имя среды будет Production в сгенерированном файле web.config. Подробнее здесь

2. Добавление свойства EnvironmentName в профили публикации.

Мы также можем добавить свойство <EnvironmentName> в профиль публикации. Откройте файл профиля публикации, который находится в Properties/PublishProfiles/{profilename.pubxml}. Это установит имя среды в web.config при публикации проекта. Подробнее здесь

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

3. Параметры командной строки с использованием dotnet publish

Кроме того, мы можем передать свойство EnvironmentName в качестве параметра командной строки команде dotnet publish. Следующая команда включит переменную среды как Development в файл web.config.

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development

Ответ 11

Как и в других ответах, я хотел, чтобы настройки среды ASP.NET Core 2.1 сохранялись при развертывании, но также применялись только к конкретному сайту.

Согласно документации Microsoft, в IIS 10 можно установить переменную среды в пуле приложений с помощью следующей команды PowerShell:

$appPoolName = "AppPool"
$envName = "Development"
cd "$env:SystemRoot\system32\inetsrv"
.\appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='$appPoolName'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='$envName']" /commit:apphost

Я, к сожалению, все еще должен использовать IIS 8.5 и думал, что мне не повезло. Однако все еще можно запустить простой сценарий PowerShell, чтобы установить значение переменной среды для сайта для ASPNETCORE_ENVIRONMENT:

Import-Module -Name WebAdministration
$siteName = "Site"
$envName = "Development"
Set-WebConfigurationProperty -PSPath IIS:\ -Location $siteName -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = $envName }

Ответ 12

Чтобы получить подробную информацию об ошибке, мне пришлось добавить переменную среды ASPNETCORE_ENVIRONMENT для соответствующего пула приложений system.applicationHost/applicationPools.

Примечание. В моем случае веб-приложением было веб-приложение ASP.NET Core 2 размещенное на IIS 10. Это можно сделать с помощью Configuration Editor в IIS Manager (см. " Редактирование коллекций с помощью редактора конфигурации", чтобы выяснить, где найти этот редактор в IIS Manager).

Ответ 13

Я создал хранилище для публикации IIS с конфигурацией среды в Web.config.

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • Настроить
    • Получите разделы из файлов .csproj и .user.csproj в файлы вашего проекта.
    • Получите файлы MyAspNetEnvironment.props, web.development.config и web.production.config.
  • конфигурация
    • Измените значение свойства ASPNETCORE_ENVIRONMENT в user.csproj соответствующим образом.

Ответ 14

На github есть хорошо документированный инструмент для xdt-преобразований. Также это не зависит от команды, и dotnet publish, и dotnet msbuild работают отлично.

Вы должны создать различные файлы web.config, такие как web.debug.cofig, web.release.config и т.д. На основании этого вы можете легко установить собственную переменную среды.