Publier sur IIS, paramètre de L'environnement Variable

en lisant ces deux questions/réponses, j'ai pu faire une Asp.net 5 app sur le serveur IIS 8.5.

Asp.net vNext début de la bêta de publier IIS dans windows server

comment configurer une application MVC6 pour fonctionner 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.

aussi, je veux courir deux versions du même Web (mise en scène, Production) sur le même serveur, donc j'ai besoin d'une méthode pour définir la variable pour chaque Web séparément.

Comment faire?

89
demandé sur Community 2015-06-25 14:31:32

11 réponses

cette réponse a été écrite à l'origine pour ASP.NET Core RC1. Dans RC2 ASP.NET Core est passé du gestionnaire générique httpPlafrom au gestionnaire spécifique aspnetCore. Notez que l'étape 3 dépend de quelle version de ASP.NET le noyau que vous utilisez.

S'avère variables d'environnement pour ASP.NET les projets de base peuvent être définis sans avoir à définir des variables d'environnement pour l'utilisateur ou à créer des entrées de commandes multiples.

  1. IIS et choisir Configuration Editor .
  2. sélectionner Configuration Editor
  3. choisir system.webServer/aspNetCore (RC2 et RTM) ou system.webServer/httpPlatform (RC1) dans Section combobox
  4. choisir Applicationhost.config ... dans From combobox.
  5. cliquez sur enviromentVariables element et ouvrez la fenêtre edit.
  6. Définissez vos variables d'environnement.
  7. Fermez la fenêtre et cliquez sur Appliquer.
  8. Fait à

de cette façon, vous n'avez pas à créer des utilisateurs spéciaux pour votre pool ou des entrées de commandes supplémentaires dans project.json . En outre, l'ajout de commandes spéciales pour chaque environnement casse " construire une fois, déployer plusieurs fois "comme vous devrez appeler dnu publish séparément pour chaque environnement, au lieu de publier une fois et déployer artefact résultant de nombreuses fois.

mis à jour pour RC2 et RTM, grâce à Mark G et tredder.

196
répondu NickAb 2016-11-10 00:25:29

mise à Jour pour la version d'origine et RC2

mise à Jour "151930920 web".config avec un sous la rubrique

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

ou pour éviter de perdre ce paramètre en écrasant web.config, faire des changements similaires à applicationHost.config spécifiant l'emplacement du site comme @NickAb le suggère.

<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>
21
répondu tredder 2016-07-06 11:01:03

Edit: comme de RC2 et versions RTM, ce conseil est hors de date. Le meilleur moyen que j'ai trouvé pour accomplir ceci dans la version est d'éditer le web suivant.sections de configuration dans IIS pour chaque environnement:

system.webServer/aspNetCore :

éditer l'entrée environnementvariable et Ajouter un paramètre de variable d'environnement:

ASPNETCORE_ENVIRONMENT : < Your environment name >


comme un au lieu de l'approche de drpdrp, vous pouvez faire ce qui suit:

  • dans votre projet.json, Ajoute les commandes qui passent 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 créer des utilisateurs supplémentaires de L'IIS.

19
répondu Joshua Barron 2016-07-18 13:58:41

après googling étendu j'ai trouvé une solution de travail, qui se compose de deux étapes.

la première étape est de définir la variable D'environnement système ASPNET_ENV à la Production et redémarrer le serveur Windows . Après cela, toutes les applications web obtiennent la valeur "Production" comme nom D'environnement.

la deuxième étape (pour activer la valeur "Staging" pour la mise en scène web) a été un peu plus difficile d'obtenir de travailler correctement, mais ici il est:

  1. créer un nouvel utilisateur windows, par exemple StagingPool sur le serveur.
  2. pour cet utilisateur, créer une nouvelle variable utilisateur ASPNETCORE_ENVIRONMENT avec la valeur 'Staging' (vous pouvez le faire en vous connectant comme cet utilisateur ou en passant par regedit)
  3. de retour en tant qu'administrateur dans IIS manager, trouver le Pool D'applications sous lequel la mise en scène web est en cours d'exécution et dans les paramètres avancés définir L'identité de l'utilisateur StagingPool .
  4. définit aussi Load User Profile à true , de sorte que les variables d'environnement sont chargées. <- très important!
  5. S'assurer que le StagingPool a des droits d'accès au dossier web et arrêter et démarrer le Pool D'applications.

maintenant le Web de mise en scène doit avoir le nom D'environnement défini à 'mise en scène'.

Mise À Jour: En Windows 7+ il y a une commande qui peut définir des variables d'environnement à partir de L'invite CMD aussi pour un utilisateur spécifié. Cette sortie aide plus exemples:

>setx /?
16
répondu drpdrp 2018-03-14 23:15:02

j'ai mes applications web (PRODUCTION, mise en scène, TEST) hébergées sur le serveur web IIS. Il n'était donc pas possible de se fier à la variable d'environnement du système D'ASPNETCORE_ENVIRONNEMENT operative, parce que la fixer à une valeur spécifique (par exemple STAGING) a un effet sur d'autres applications.

comme solution de rechange, 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, sur la base de mon type d'application (Production, Staging ou Test), je règle ce fichier en conséquence: supposons que je déploie L'application TEST, j'aurai:

"ASPNETCORE_ENVIRONMENT": "Test"

après ça, au programme.fichier cs il suffit de récupérer cette valeur, puis de définir l'environnement du 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 les envsettings.json dans les publications (projet.json):

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

Cette solution me rend libre d'avoir ASP.NET application de base hébergée sur le même IIS, indépendamment de la valeur variable envoroment.

12
répondu Christian Del Bianco 2017-02-09 17:36:05

pour prolonger la réponse de @tredder, vous pouvez modifier les variables d'environnement en utilisant 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

6
répondu Christian 2016-06-24 09:02:16

@tredder solution avec l'édition applicationHost.la 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'ai API "151930920 de projet" et APP projet, dans le même domaine, placés dans différents répertoires virtuels
  • Root page XXX ne semble pas propager la variable ASPNETCORE_ENVIRONMENT à ses enfants dans les répertoires virtuels et...
  • ...Je ne peux pas définir les variables à l'intérieur du répertoire virtuel comme @NickAb l'a décrit (erreur la requête n'est pas supportée. (Exception de HRESULT: 0x80070032) pendant l'enregistrement des modifications dans L'éditeur de Configuration):
  • Va dans applicationHost.config et manuellement créer des noeuds comme ceci:

    <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 L'IIS a fait le travail.

5
répondu Bartosz Lenar 2016-09-23 13:31:59

ce que vous devez savoir à un endroit:

  • pour que les variables d'environnement puissent outrepasser les paramètres de configuration, elles doivent être préfixées par ASPNETCORE_ .
  • si vous voulez faire correspondre les noeuds enfant dans votre configuration JSON, utilisez : comme séparateur. Si la plate-forme n'autorise pas les boutons de commande dans les touches variables d'environnement, utilisez __ à la place.
  • vous voulez que vos paramètres se terminent par ApplicationHost.config . À l'aide de IIS L'éditeur de Configuration fera en sorte que vos entrées soient écrites sur Web.config de l'application et seront écrasées par le prochain déploiement!
  • pour modifier ApplicationHost.config , vous voulez 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 URL-safe peuvent être échappés comme Unicode, comme %u007b pour le crochet Bouclé 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é, elle sera ajoutée plusieurs fois! Pour supprimer une valeur, 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 .
2
répondu realMarkusSchmidt 2018-03-19 18:59:52

pour obtenir les détails sur l'erreur, j'ai dû ajouter ASPNETCORE_ENVIRONMENT variable d'environnement 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 . Il peut être fait via Configuration Editor dans IIS Manager (voir éditer des Collections avec éditeur de Configuration pour savoir où trouver cet éditeur dans IIS Manager ).

0
répondu Dmitry Pavlov 2018-04-25 19:13:45

j'ai créé un dépôt pour publier IIS avec la configuration de l'environnement dans le Web.config.

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • Obtenir les sections .csproj et .utilisateur.les fichiers csproj dans vos fichiers de projet.
  • Obtenir le MyAspNetEnvironment.des accessoires, des web.développement.config et web.production.les fichiers de configuration.
  • changement the value of ASPNETCORE_ENVIRONMENT property in user.csproj de manière claire.
0
répondu subcoder 2018-05-28 11:27:34

il existe un outil bien documenté sur github pour XDT-transformations . En outre, il ne dépend pas de la commande, les deux de dotnet publier et dotnet msbuild fonctionne très bien.

vous devez créer web différent.fichiers de configuration tels web.débogage.cofig, web.publier.config etc. Basé sur que vous pouvez facilement définir vos propres variables d'environnement.

0
répondu Anik Saha 2018-07-24 07:38:04