web-dev-qa-db-fra.com

Publier dans IIS, définition de la variable d'environnement

En lisant ces deux questions/réponses, j'ai pu exécuter une application Asp.net 5 sur le serveur IIS 8.5.

Première version bêta de Asp.net vNext sur IIS dans Windows Server

Comment configurer une application MVC6 pour travailler sur IIS?

Le problème est que l'application Web utilise toujours env.EnvironmentName avec la valeur Development même lorsqu'elle est exécutée sur IIS.

De plus, je souhaite exécuter deux versions du même site Web (Staging, Production) sur le même serveur. J'ai donc besoin d'une méthode pour définir la variable pour chaque site Web séparément.

Comment faire ça?

99
drpdrp

Cette réponse a été écrite à l'origine pour ASP.NET Core RC1. En RC2, ASP.NET Core est passé d’un gestionnaire httpPlafrom générique à un gestionnaire spécifique à aspnetCore. Notez que l'étape 3 dépend de la version d'ASP.NET Core que vous utilisez.

Il s'avère que les variables d'environnement pour les projets ASP.NET Core peuvent être définies sans avoir à définir de variables d'environnement pour l'utilisateur ni à créer plusieurs entrées de commandes.

  1. Accédez à votre application dans IIS et choisissez Configuration Editor.
  2. Sélectionnez Configuration Editor 
  3. Choisissez system.webServer/aspNetCore (RC2 et RTM) ou system.webServer/httpPlatform (RC1) dans la liste déroulante Section
  4. Choisissez Applicationhost.config ... dans la liste déroulante From.
  5. Cliquez sur l'élément enviromentVariables et ouvrez la fenêtre d'édition.
  6. Définissez vos variables d'environnement.
  7. Fermez la fenêtre et cliquez sur Appliquer.
  8. Terminé

De cette façon, vous n'avez pas besoin de créer des utilisateurs spéciaux pour votre pool ni de créer des entrées de commandes supplémentaires dans project.json. De plus, l'ajout de commandes spéciales pour chaque environnement interrompt "créer, déployer plusieurs fois", car vous devrez appeler dnu publish séparément pour chaque environnement, au lieu de publier une fois et de déployer l'artefact résultant plusieurs fois.

Mis à jour pour RC2 et RTM, merci à Mark G et à la faneuse.

218
NickAb

Mettre à jour web.config avec un <environmentVariables> section under <aspNetCore>

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

Ou, pour éviter de perdre ce paramètre lors de l'écrasement de web.config, apportez les mêmes modifications à applicationHost.config en spécifiant l'emplacement du site comme le suggère @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>
28
tredder

Edit: à partir des versions RC2 et RTM, cet avis est obsolète. Pour ce faire, la meilleure solution consiste à modifier les sections Web.config suivantes dans IIS pour chaque environnement:

system.webServer/aspNetCore

Editez l'entrée environmentVariable et ajoutez un paramètre de variable d'environnement:

ASPNETCORE_ENVIRONMENT: < Your environment name >


En guise d'alternative à l'approche drpdrp, vous pouvez effectuer les opérations suivantes:

  • Dans votre projet.json, ajoutez des commandes qui transmettent la variable ASPNET_ENV directement à 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" }

  • Lors de la publication, utilisez l'option --iis-command pour spécifier un environnement:

dnu publish --configuration Debug --iis-command Staging --out "outputdir" --runtime dnx-clr-win-x86-1.0.0-rc1-update1

J'ai trouvé cette approche moins intrusive que la création d'utilisateurs IIS supplémentaires.

21
Joshua Barron

Après une longue recherche sur Google, j'ai trouvé une solution efficace en deux étapes.

La première étape consiste à définir la variable d'environnement ASPNET_ENV sur l'ensemble du système sur Production et Redémarrez Windows Server. Après cela, toutes les applications Web obtiennent la valeur 'Production' en tant que NomEnvironnement.

La deuxième étape (pour activer la valeur 'Staging' pour la mise en scène Web) était un peu plus difficile pour arriver à fonctionner correctement, mais la voici:

  1. Créez un nouvel utilisateur Windows, par exemple StagingPool sur le serveur.
  2. Pour cet utilisateur, créez une nouvelle variable utilisateur ASPNETCORE_ENVIRONMENT avec la valeur 'Staging' (vous pouvez le faire en vous connectant en tant qu'utilisateur ou via regedit).
  3. De retour en tant qu'administrateur dans le gestionnaire IIS, recherchez le pool d'applications sous lequel le site Web de stockage intermédiaire est en cours d'exécution et dans les paramètres avancés, définissez Identity sur l'utilisateur StagingPool.
  4. Définissez également Load User Profile sur true pour que les variables d'environnement soient chargées. <- très important!
  5. Assurez-vous que StagingPool dispose des droits d’accès au dossier Web et d’arrêter et de démarrer le pool d’applications.

Le nom d’environnement doit maintenant être défini sur «Staging» sur le site Web de stockage intermédiaire.

Mise à jour: Dans Windows 7+ il existe une commande qui permet de définir des variables d'environnement à partir de l'invite CMD également pour un utilisateur spécifié. Cette sortie aide et des exemples:

>setx /?
16
drpdrp

Mes applications Web (PRODUCTION, STAGING, TEST) sont hébergées sur le serveur Web IIS. Il n’a donc pas été possible de s’appuyer sur la variable d’environnement système d’ASPNETCORE_ENVIRONMENT operative, car sa définition sur une valeur spécifique (par exemple, STAGING) a un effet sur d’autres applications. 

En guise de solution de contournement, j'ai défini un fichier personnalisé (envsettings.json) dans ma solution visualstudio:

 enter image description here

avec le contenu suivant:

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

Ensuite, en fonction de mon type d'application (Production, Stockage intermédiaire ou Test), je règle ce fichier en conséquence: si je déploie l'application TEST, j'aurai:

"ASPNETCORE_ENVIRONMENT": "Test"

Après cela, dans le fichier Program.cs, récupérez simplement cette valeur puis définissez l'environnement de 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();
        }
    }

N'oubliez pas d'inclure le fichier envsettings.json dans les options publishOptions (project.json):

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

Cette solution me permet d'avoir l'application ASP.NET CORE hébergée sur le même serveur IIS, indépendamment de la valeur de la variable envoroment.

14

Pour prolonger la réponse de @ tredder, vous pouvez modifier les variables d'environnement avec appcmd

Mise en scène

%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST

Production

%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST

7
Christian

La solution @tredder avec édition applicationHost.config est celle qui fonctionne si vous avez plusieurs applications différentes situées dans des répertoires virtuels sur IIS.

Mon cas est:

  • J'aiAPIprojet etAPPprojet, sous le même domaine, placés dans différents répertoires virtuels 
  • La page racineXXXne semble pas propager la variable ASPNETCORE_ENVIRONMENT à ses enfants dans des répertoires virtuels et ...
  • ... Je ne parviens pas à définir les variables du répertoire virtuel comme décrit par @NickAb (vous obtenez l'erreur la demande n'est pas prise en charge. (Exception de HRESULT: 0x80070032) lors de l'enregistrement des modifications dans l'éditeur de configuration):
  • Entrer dans applicationHost.config et créer manuellement des nœuds comme celui-ci:

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

et le redémarrage de IIS a effectué le travail.

5
Bartosz Lenar

Ce que vous devez savoir au même endroit:

  • Pour que les variables d'environnement remplacent les paramètres de configuration, elles doivent être précédées du préfixe ASPNETCORE_
  • Si vous souhaitez faire correspondre les nœuds enfants dans votre configuration JSON, utilisez : comme séparateur. Si la plate-forme n'autorise pas les deux points dans les clés de variable d'environnement, utilisez plutôt __.
  • Vous voulez que vos paramètres se retrouvent dans ApplicationHost.config. En utilisant l'éditeur de configuration IIS, vos entrées seront écrites dans le Web.config de l'application - et seront écrasées lors du prochain déploiement!
  • Pour modifier ApplicationHost.config, vous souhaitez utiliser appcmd.exe pour vous assurer que vos modifications sont cohérentes. Exemple: %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

  • Les caractères qui ne sont pas sécurisés contre les URL peuvent être échappés au format Unicode, comme %u007b pour l'accolade gauche.

  • Pour lister vos paramètres actuels (combinés avec les valeurs de Web.config): %systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
  • Si vous exécutez la commande pour définir une clé de configuration plusieurs fois pour la même clé, celle-ci sera ajoutée plusieurs fois! Pour supprimer une valeur existante, utilisez quelque chose comme %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.
4
realMarkusSchmidt

Vous pouvez également passer le ASPNETCORE_ENVIRONMENT souhaité dans la commande dotnet publish en tant qu'argument en utilisant: 

/p:EnvironmentName=Staging

par exemple.:

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

Cela générera le fichier web.config avec l’environnement correct spécifié pour votre projet:

<environmentVariables>
  <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
3
Sheldon Nunes

Semblable à d'autres réponses, je souhaitais m'assurer que mon paramètre d'environnement ASP.NET Core 2.1 persistait dans tous les déploiements, mais qu'il ne s'appliquait également qu'au site spécifique.

Selon la documentation de Microsoft, il est possible de définir la variable d'environnement sur le pool d'applications à l'aide de la commande PowerShell suivante dans 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

Malheureusement, je dois encore utiliser IIS 8.5 et je pensais ne pas avoir de chance. Toutefois, il est toujours possible d'exécuter un script PowerShell simple pour définir une valeur de variable d'environnement spécifique au site pour 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 }
2
dasch88

Il existe un outil bien documenté sur github pour xdt-transformations . En outre, cela ne dépend pas de la commande, à la fois de dotnet publish et de dotnet msbuild fonctionne bien. 

Vous devez créer différents fichiers web.config tels que web.debug.cofig, web.release.config, etc. Sur cette base, vous pouvez facilement définir votre propre variable d'environnement.

0
Anik Saha

J'ai créé un référentiel pour la publication IIS avec la configuration de l'environnement dans Web.config.

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • Installer
    • Obtenez les sections des fichiers .csproj et .user.csproj dans les fichiers de votre projet.
    • Obtenez les fichiers MyAspNetEnvironment.props, web.development.config et web.production.config.
  • Configuration
    • Modifiez la valeur de la propriété ASPNETCORE_ENVIRONMENT dans user.csproj de manière pertinente.
0
subcoder

Outre les options mentionnées ci-dessus, il existe quelques autres solutions qui fonctionnent bien avec des déploiements automatisés ou qui nécessitent moins de changements de configuration.

1. Modification du fichier de projet (.CsProj) fichier 

MSBuild prend en charge la propriété EnvironmentName qui peut vous aider à définir la bonne variable d'environnement en fonction de l'environnement que vous souhaitez déployer. Le nom de l'environnement serait ajouté dans le fichier web.config lors de la phase de publication.

Ouvrez simplement le fichier de projet (* .csProj) et ajoutez le code XML suivant.

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

Le code ci-dessus ajouterait le nom de l'environnement sous la forme Development pour la configuration de débogage ou si aucune configuration n'est spécifiée. Pour toute autre configuration, le nom de l'environnement serait Production dans le fichier web.config généré. Plus de détails ici

2. Ajout de la propriété EnvironmentName dans les profils de publication.

Nous pouvons également ajouter la propriété <EnvironmentName> dans le profil de publication. Ouvrez le fichier de profil de publication situé au Properties/PublishProfiles/{profilename.pubxml}. Le nom de l’environnement sera défini dans web.config lors de la publication du projet. Plus de détails ici

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

3. Options de ligne de commande utilisant dotnet publish

De plus, nous pouvons transmettre la propriété EnvironmentName en tant qu’option de ligne de commande à la commande dotnet publish. La commande suivante inclurait la variable d’environnement Development dans le fichier web.config.

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

0
Abhinav Galodha

Pour obtenir les détails sur l'erreur, je devais ajouter la variable d'environnement ASPNETCORE_ENVIRONMENT pour le pool d'applications correspondant system.applicationHost/applicationPools

Remarque: l'application Web dans mon cas était ASP.NET Core 2 application Web hébergée sur IIS 10. Cela peut être fait via Configuration Editor dans IIS Manager (voir Édition de collections avec l'éditeur de configuration pour savoir où trouver cet éditeur dans IIS Manager).

0
Dmitry Pavlov