Опублікуйте в IIS, встановивши "Variable Environment"


134

Читаючи ці два питання / відповіді, я зміг запустити додаток Asp.net 5 на сервері IIS 8.5.

Asp.net vNext ранньої бета-версії публікувати на IIS на сервері Windows

Як налаштувати додаток MVC6 для роботи на IIS?

Проблема полягає в тому, що веб-додаток все ще використовується env.EnvironmentNameзі значенням Developmentнавіть під час роботи на IIS.

Крім того, я хочу запустити дві версії тієї ж Веб (Staging, Production) на одному сервері, тому мені потрібен метод встановити змінну для кожної Web окремо.

Як це зробити?


4
В одному зазвичай три мережевих середовища: розробка, постановка та виробництво. Веб-сервер знаходиться в одному середовищі. Таким чином, встановлення змінної системного середовища для сервера зазвичай не є реальним обмеженням. Ще можна використовувати Properties\launchSettings.jsonдля імітації іншого середовища для налагодження у Visual Studio.
Олег

Відповіді:


286

Ця відповідь спочатку була написана для 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. введіть тут опис зображення
  6. Встановити змінні середовища.
  7. Закрийте вікно та натисніть Застосувати.
  8. Зроблено

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

Оновлено для RC2 та RTM, завдяки Mark G і тредер.


12
Для кроку 3 я використав system.webServer/aspNetCoreзамість цього.
Марк Г

1
Змінні системного середовища успадковуються процесами на старті. Тож якщо ви зміните якусь змінну env під час запуску програми, ви не зможете побачити ці зміни за замовчуванням. Щоб зміни в системі env var набули чинності, вам потрібно буде принаймні перезапустити сайт, можливо пул чи навіть службу IIS, залежно від того, як IIS створює процеси. Це потрібно перевірити.
NickAb

7
Чи не буде вимкнено налаштування, додані через Редактор конфігурації при наступному розгортанні?
Бред Гарднер

11
@ brad-gardner, якщо зміни в Applicationhost.config замість web.config внесені, зміни зберігатимуться між розгортанням.
NickAb

15
Працює для Asp.Net Core 2.0
Frank Cannon

34

Оновлення 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>

2
Це відрізняється тим, що ваш web.config є частиною проекту і є версією VCS. Якщо у вас є кілька середовищ, таких як prod, staging, dev, вам знадобиться певний спосіб перетворити web.config для кожного. Зміна ApplicationHost.config в IIS впливає лише на цей IIS. Таким чином, ви можете мати єдиний web.config у своїх змінних VCS та оточуючих середовищ, характерних для IIS, які перекривають змінні web.config. ApplicationHost.config можна редагувати програмно за допомогою PowerShell iis.net/learn/manage/powershell/…
NickAb

Дякуємо @NickAb, що уникає необхідності оновлювати web.config кожного розгортання. Я оновив свою відповідь.
Тревор Даніельс

У мене виникають проблеми з цим із силових завдань, я продовжую отримувати 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натомість використав .
Крістіан

@Christian, перевірити цей відповідь: stackoverflow.com/a/50869935/33533 змінна оточення ім'я і значення йдуть в хеш - таблиці, так що з вашого прикладу було бSet-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
Curtis Купує

21

Редагувати: станом на версії RC2 та RTM ця порада застаріла. Найкращий спосіб, який я знайшов досягти цього у випуску, - це редагувати такі розділи web.config в IIS для кожного середовища:

system.webServer/aspNetCore:

Редагуйте записVariable entry та додайте налаштування змінної середовища:

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.


11
Якщо ви публікуєте через msdeploy візуальної студії. Тоді ви можете помістити <IISCommand> Staging </IISCommand> у свій файл .pubxml, і він розгорнеться за допомогою вказаної команди IIS, навіть якщо ви не можете вказати його в інтерфейсі публікації.
Дін Північний,

@DeanNorth - Це золото !! Працює як чемпіон! Дякую, що поділились!
С. Расмуссен

17

У мене на веб-сервері IIS розміщені мої веб-додатки (ВИРОБНИЦТВО, СТАГІНГ, ТЕСТ). Таким чином, не вдалося покластися на системну змінну навколишнього середовища оперативного ASPNETCORE_ENVIRONMENT, оскільки встановлення її на певне значення (наприклад, STAGING) впливає на інші програми.

Як обхід, я визначив спеціальний файл (envsettings.json) у своєму візуальному студії:

введіть тут опис зображення

із наступним вмістом:

{
  // Possible string values reported below. When empty it use ENV variable value or Visual Studio setting.
  // - Production
  // - Staging
  // - Test
  // - Development
  "ASPNETCORE_ENVIRONMENT": ""
}

Тоді, виходячи з типу мого додатка (Виробництво, Постановка чи Тест), я встановив цей файл відповідним чином: припустимо, я розгортаю програму 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 до публікаціїOptions (project.json):

  "publishOptions":
  {
    "include":
    [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "envsettings.json",
      "appsettings.json",
      "appsettings*.json",
      "web.config"
    ]
  },

Це рішення дозволяє мені вільно розміщувати додаток ASP.NET CORE на тому ж IIS, незалежно від значення змінної envoroment.


Дуже добре, що я пропоную лише зміни - swap var currentDirectoryPath = Directory.GetCurrentDirectory (); для var currentDirectoryPath = PlatformServices.Default.Application.ApplicationBasePath; Це набагато безпечніший спосіб отримати поточний реж.
Пітер Коттас

7
Який чудовий досвід, коли вам доведеться створити ще один шар конфігурацій для керування конфігураціями фреймворку
Kugel,

16

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

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

Другий крок (щоб увімкнути значення "Постановка" для інсталяції в Інтернеті) був досить складним для того, щоб правильно працювати, але ось це:

  1. Створіть нового користувача Windows, наприклад StagingPool на сервері.
  2. Для цього користувача створіть нову змінну користувача ASPNETCORE_ENVIRONMENT зі значенням "Постановка" (це можна зробити, увійшовши як цей користувач або через regedit)
  3. Повернувшись як адміністратор у менеджері IIS, знайдіть пул додатків, під яким працює Інструментальна мережа, а в розширених налаштуваннях встановіть Ідентичність користувача StagingPool .
  4. Також встановіть для параметра " Завантажити профіль користувача" значення " true" , щоб змінні середовища були завантажені. <- дуже важливо!
  5. Переконайтеся, що StagingPool має права доступу до веб-папки, а також Зупинити та запустити пул додатків.

Тепер у Інструментальній веб-програмі має бути встановлене середовищеNameName "Постановка".

Оновлення: У Windows 7+ є команда, яка може встановлювати змінні середовища з підказки CMD також для певного користувача. Це дає допомогу плюс зразки:

>setx /?

1
Здається, що в ASP.NET 5 RC1 змінна середовища була змінена на Hosting: Environment.
Грейді Вернер

Як ми встановимо "Завантажити профіль користувача" на істинне, коли ми розгортаємо це у веб-додатку Azure?
Пунет Гханшані

@PunitGanshani Як я розумію, на порталі azure для веб-додатків є розділ "Налаштування програми", де ви можете встановити пари оточуючих
drpdrp

@GradyWerner Для RC2 вони змінюють його (станом на зараз) на ASPNET_ENVIRONMENT ;-)
b.pell

1
@ b.pell Здається, це зараз ASPNETCORE_ENVIRONMENT :)
Марк G

11

Ви також можете передати потрібну ASPNETCORE_ENVIRONMENTкоманду публікації в dotnet як аргумент, використовуючи:

/p:EnvironmentName=Staging

наприклад:

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

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

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

9

Крім варіантів, зазначених вище, є ще кілька рішень, які добре працюють з автоматизованими розгортаннями або потребують менших змін конфігурації.

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

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

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


7

Щоб продовжити відповідь на @ 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


Ось як зробити те ж саме з Powershell на сервері збірки без встановленого IIS. gist.github.com/markarnott/c4aec1fc544fe89e2bd21f3f00d78933
Марк Арнотт

Вказавши "staging.example.com" або "example.com", змінна застосовуватиметься лише до тих конкретних веб-сайтів. Опущення, що створить глобальну змінну для всіх веб-сайтів на сервері.
смертельна собака

6

Що потрібно знати в одному місці:

  • Щоб змінні середовища перекривали будь-які параметри конфігурації, вони повинні мати префікс 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.

1
зауважте, що зі /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 для веб-сайту, але це не проблема, оскільки він параметризований під час випуску.
олекса

6

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

Згідно з документацією Microsoft, можна встановити змінну середовища в пулі додатків, використовуючи наступну команду PowerShell в IIS 10:

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

5

Рішення @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 зробив цю роботу.


0

Щоб отримати детальну інформацію про помилку, мені довелося додати ASPNETCORE_ENVIRONMENTзмінну середовища для відповідного пулу програм system.applicationHost/applicationPools .

Примітка. У моєму випадку ASP.NET Core 2веб-програма була веб-додатком, на якому розміщено IIS 10. Це може бути зроблено з допомогою Configuration Editorв IIS Manager(див Редагування колекції з допомогою Редактора конфігурації , щоб з'ясувати , де знайти цей редактор IIS Manager).


0

Я створив сховище для публікації IIS з конфігурацією середовища в Web.config.

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • Налаштування
    • Отримайте розділи з .csproj та .user.csproj файлів у файли проекту.
    • Отримайте файли MyAspNetEnvironment.props, web.development.config та web.production.config.
  • Конфігурація
    • Змініть значення властивості ASPNETCORE_ENVIRONMENT у user.csproj відповідно.

Це, мабуть, не дає якісної відповіді на питання. Будь ласка, відредагуйте свою відповідь, додавши загальну інформацію про це рішення, або просто видаліть її та опублікуйте як коментар до питання. Дякую!
sɐunıɔ ןɐ qɐp

0

Я змінив відповідь, яку дав @Christian Del Bianco . Я змінив процес для .net core 2 і верхніх файлів project.json тепер абсолютним.

  1. Спочатку створіть файл appsettings.json в кореневій директорії. зі змістом

      {
         // Possible string values reported below. When empty it use ENV 
            variable value or Visual Studio setting.
         // - Production
         // - Staging
         // - Test
        // - Development
       "ASPNETCORE_ENVIRONMENT": "Development"
     }
    
  2. Потім створіть ще два файли налаштування appsettings.Development.json та appsettings.Production.json з необхідною конфігурацією.

  3. Додайте необхідний код для створення середовища у файл Program.cs .

    public class Program
    {
    public static void Main(string[] args)
    {
        var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    
      ***var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();***
    
        try
        {
            ***CreateWebHostBuilder(args, enviromentValue).Build().Run();***
        }
        catch (Exception ex)
        {
            //NLog: catch setup errors
            logger.Error(ex, "Stopped program because of setup related exception");
            throw;
        }
        finally
        {
            NLog.LogManager.Shutdown();
        }
    }
    
    public static IWebHostBuilder CreateWebHostBuilder(string[] args, string enviromentValue) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
            })
            .UseNLog()
            ***.UseEnvironment(enviromentValue);***
    

    }

  4. Додайте envsettings.json у свій .csproj файл для копіювання у опублікований каталог.

       <ItemGroup>
            <None Include="envsettings.json" CopyToPublishDirectory="Always" />
        </ItemGroup>
    
  5. Тепер просто змініть ASPNETCORE_ENVIRONMENT так, як вам потрібно, у файл envsettings.json і опублікуйте.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.