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


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

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

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

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

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

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

11 89

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) in Section combobox
  4. выбрать Applicationhost.config ... на From combobox.
  5. нажать на кнопку enviromentVariables элемент и открыть окно редактирования.
  6. установите переменные среды.
  7. закройте окно и нажмите кнопку Применить.
  8. сделал

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

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

обновлено для RTM и RC2

обновление web.конфигурации С под

<configuration>
  <system.webServer>
    <aspNetCore .....>
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

или чтобы избежать потери этой настройки при перезаписи web.config, внесите аналогичные изменения в applicationHost.конфигурации указание местоположения сайта, как предлагает @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 Server. После этого все веб-приложения получают значение "Production" как EnvironmentName.

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

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

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

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

>setx /?

у меня есть мои веб-приложения (производство, постановка, тест), размещенные на веб-сервере IIS. Таким образом, невозможно было полагаться на системную переменную окружения aspnetcore_environment operator, потому что установка ее на определенное значение (например, 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 (проект.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.конфигурации - Это тот, который работает, если у вас есть несколько различных приложений, расположенных в виртуальных каталогов в IIS.

мой случай:

  • у меня есть API и APP проект, находящийся в одном домене, размещен в разных виртуальных каталогах
  • корневую страницу XXX не похоже, чтобы распространять aspnetcore_environment переменной для своих детей в виртуальных каталогах и...
  • ...Я не могу установить переменные внутри виртуального каталога, как описано в @NickAb (got error запрос не поддерживается. (Исключение из HRESULT: 0x80070032) во время сохранения изменений в Редакторе конфигурации):
  • зайдя в applicationHost.конфигурации и вручную создавать узлы, как это:

    <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 для левой фигурной скобкой.

  • для отображения текущих настроек (в сочетании со значениями из интернета.конфигурации): %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. На основе этого вы можете легко установить свою собственную переменную окружения.