Публикация в 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 основные проекты могут быть установлены без необходимости устанавливать переменные среды для пользователя или создавать несколько записей команд.

  1. перейдите в приложение в IIS и выберите Configuration Editor.
  2. выберите Configuration Editor
  3. выбрать system.webServer/aspNetCore (RC2 и RTM) или system.webServer/httpPlatform (RC1) в Section combobox
  4. выбрать Applicationhost.config ... на From combobox.
  5. нажать на кнопку enviromentVariables элемент и открыть окно редактирования.
  6. установите переменные среды.
  7. закройте окно и нажмите кнопку Применить.
  8. сделал

таким образом, вам не нужно создавать специальных пользователей для вашего пула или создавать дополнительные команды записи в 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) был довольно сложным для правильной работы, но вот он:

  1. создать новый пользователь windows, например StagingPool на сервере.
  2. для этого пользователя создайте новую пользовательскую переменную ASPNETCORE_ENVIRONMENT со значением "Staging" (вы можете сделать это, войдя в систему как этот пользователь или через regedit)
  3. назад в качестве администратора в диспетчере IIS найдите пул приложений, под которым работает промежуточный веб-сайт, и в расширенных настройках установите Identity в user StagingPool.
  4. и набор Загрузить Профиль Пользователя для правда, поэтому переменные среды загружаются. - очень важно!
  5. обеспечить StagingPool имеет права доступа к веб-папке и остановки и запуска пула приложений.

теперь промежуточный веб должен иметь EnvironmentName значение "промежуточный".

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

>setx /?

у меня есть мои веб-приложения (производство, постановка, тест), размещенные на веб-сервере IIS. Поэтому было невозможно полагаться на системную переменную среды ASPNETCORE_ENVIRONMENT operative, поскольку установка ее на определенное значение (например, STAGING) влияет на другие приложения.

в качестве обходного пути я определил пользовательский файл (envsettings.json) в моем решении visualstudio:

enter image description here

с последующим содержание:

{
  // 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. На основе этого вы можете легко установить свою собственную переменную среды.