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?
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.
Configuration Editor
.Configuration Editor
system.webServer/aspNetCore
(RC2 et RTM) ou system.webServer/httpPlatform
(RC1) dans la liste déroulante Section
Applicationhost.config ...
dans la liste déroulante From
.enviromentVariables
et ouvrez la fenêtre d'édition.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.
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>
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:
"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
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.
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:
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 /?
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:
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.
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
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:
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.
Ce que vous devez savoir au même endroit:
ASPNETCORE_
. :
comme séparateur. Si la plate-forme n'autorise pas les deux points dans les clés de variable d'environnement, utilisez plutôt __
.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.
%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
.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>
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 }
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.
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
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
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
).