Beim Lesen dieser beiden Fragen/Antworten konnte ich eine Asp.net 5-App auf dem IIS 8.5-Server ausführen.
Asp.net vNext frühe Beta-Veröffentlichung auf IIS auf dem Windows-Server
Wie konfiguriere ich eine MVC6-App für IIS?
Das Problem ist, dass die Web-App env.EnvironmentName
mit dem Wert Development
auch dann verwendet, wenn sie unter IIS ausgeführt wird.
Außerdem möchte ich zwei Versionen desselben Webs (Staging, Production) auf demselben Server ausführen. Daher brauche ich eine Methode, um die Variable für jedes Web separat festzulegen.
Wie macht man das?
Diese Antwort wurde ursprünglich für ASP.NET Core RC1 geschrieben. In RC2 wurde ASP.NET Core vom generischen httpPlafrom-Handler auf aspnetCore-spezifische umgestellt. Beachten Sie, dass Schritt 3 davon abhängt, welche Version von ASP.NET Core Sie verwenden.
Es stellt sich heraus, dass Umgebungsvariablen für ASP.NET Core-Projekte festgelegt werden können, ohne dass Umgebungsvariablen für Benutzer festgelegt werden müssen oder mehrere Befehlseinträge erstellt werden müssen.
Configuration Editor
.Configuration Editor
auswählen system.webServer/aspNetCore
(RC2 und RTM) oder system.webServer/httpPlatform
(RC1) im Kombinationsfeld Section
Applicationhost.config ...
im Kombinationsfeld From
.enviromentVariables
Element und öffnen Sie das Bearbeitungsfenster.Auf diese Weise müssen Sie keine speziellen Benutzer für Ihren Pool erstellen oder zusätzliche Befehlseinträge in project.json
..__ erstellen. Außerdem müssen Sie für jede Umgebungsunterbrechung spezielle Befehle hinzufügen, die nur einmal erstellt werden, viele Male implementieren, da Sie dnu publish
separat aufrufen müssen in jeder Umgebung statt nur einmal zu veröffentlichen und das resultierende Artefakt viele Male bereitzustellen.
Für RC2 und RTM dank Mark G und Tredder aktualisiert.
Aktualisieren Sie web.config mit einem <environmentVariables> section unter <aspNetCore>
<configuration>
<system.webServer>
<aspNetCore .....>
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
</system.webServer>
</configuration>
Um zu vermeiden, dass diese Einstellung beim Überschreiben von web.config verloren geht, nehmen Sie ähnliche Änderungen an applicationHost.config vor.
<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: Ab RC2 und RTM ist dieser Hinweis nicht mehr aktuell. Die beste Möglichkeit, dies in der Version zu erreichen, besteht darin, die folgenden web.config-Abschnitte in IIS für jede Umgebung zu bearbeiten:
system.webServer/aspNetCore
:
Bearbeiten Sie den environmentVariable-Eintrag und fügen Sie eine Umgebungsvariableneinstellung hinzu:
ASPNETCORE_ENVIRONMENT
: < Your environment name >
Als Alternative zum Ansatz von drpdrp können Sie Folgendes tun:
"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
, um eine Umgebung anzugeben:dnu publish --configuration Debug --iis-command Staging --out "outputdir" --runtime dnx-clr-win-x86-1.0.0-rc1-update1
Ich fand diesen Ansatz weniger aufdringlich als das Erstellen zusätzlicher IIS - Benutzer.
Nach ausgiebigem Googeln habe ich eine funktionierende Lösung gefunden, die aus zwei Schritten besteht.
Der erste Schritt besteht darin, die systemweite Umgebungsvariable ASPNET_ENV auf Production und Windows Server neu starten zu setzen. Danach erhalten alle Web-Apps als EnvironmentName den Wert 'Production'.
Der zweite Schritt (um den Wert 'Staging' für das Staging-Web zu aktivieren) war etwas schwieriger, um richtig an die Arbeit zu gelangen, aber hier ist es:
Jetzt sollte im Staging-Web der Umgebungsname auf 'Staging' gesetzt sein.
Update: In Windows 7+ gibt es einen Befehl , der Umgebungsvariablen von CMD Prompt auch für einen angegebenen Benutzer festlegen kann. Dies gibt Hilfe und Beispiele aus:
>setx /?
Ich habe meine Webanwendungen (PRODUCTION, STAGING, TEST) auf IIS Webserver gehostet. Es war daher nicht möglich, sich auf die Systemumgebungsvariable von ASPNETCORE_ENVIRONMENT operating zu verlassen, da die Einstellung auf einen bestimmten Wert (z. B. STAGING) Auswirkungen auf andere Anwendungen hat.
Um das Problem zu umgehen, habe ich eine benutzerdefinierte Datei (envsettings.json) in meiner visualstudio-Lösung definiert:
mit folgendem Inhalt:
{
// Possible string values reported below. When empty it use ENV variable value or Visual Studio setting.
// - Production
// - Staging
// - Test
// - Development
"ASPNETCORE_ENVIRONMENT": ""
}
Dann, basierend auf meinem Anwendungstyp (Produktion, Staging oder Test), stelle ich diese Datei entsprechend ein: Angenommen, ich setze eine TEST-Anwendung ein, habe ich:
"ASPNETCORE_ENVIRONMENT": "Test"
Rufen Sie anschließend in der Datei Program.cs diesen Wert ab und legen Sie die Umgebung von webHostBuilder fest:
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();
}
}
Denken Sie daran, die Datei envsettings.json in die publishOptions (project.json) aufzunehmen:
"publishOptions":
{
"include":
[
"wwwroot",
"Views",
"Areas/**/Views",
"envsettings.json",
"appsettings.json",
"appsettings*.json",
"web.config"
]
},
Durch diese Lösung kann ich ASP.NET CORE-Anwendungen unabhängig vom Envoroment-Variablenwert auf demselben IIS hosten.
Um die Antwort von @ tredder zu erweitern, können Sie die Umgebungsvariablen mit appcmd
ändern.
Inszenierung
%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST
Produktion
%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST
@tredder-Lösung mit der Bearbeitung von applicationHost.config funktioniert, wenn Sie mehrere verschiedene Anwendungen in virtuellen Verzeichnissen in IIS haben.
Mein Fall ist:
In applicationHost.config gehen und Knoten wie folgt manuell erstellen:
<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>
und Neustart des IIS erledigte die Arbeit.
Was Sie an einem Ort wissen müssen:
ASPNETCORE_
vorangestellt werden. :
als Trennzeichen. Wenn die Plattform keine Doppelpunkte in Schlüsseln der Umgebungsvariablen erlaubt, verwenden Sie stattdessen __
.ApplicationHost.config
enden. Wenn Sie den IIS Konfigurationseditor verwenden, werden Ihre Eingaben in den Web.config
der Anwendung geschrieben und mit der nächsten Bereitstellung überschrieben!Um ApplicationHost.config
zu ändern, möchten Sie appcmd.exe
verwenden, um sicherzustellen, dass Ihre Änderungen konsistent sind. Beispiel: %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
Zeichen, die nicht URL-sicher sind, können als Unicode geschützt werden, z. B. %u007b
für die linke geschweifte Klammer.
%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
.Sie können alternativ den gewünschten ASPNETCORE_ENVIRONMENT
als Argument in den Befehl dotnet publish eingeben:
/p:EnvironmentName=Staging
z.B.:
dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging
Dadurch wird die Datei web.config mit der für Ihr Projekt angegebenen korrekten Umgebung generiert:
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
Ähnlich wie bei anderen Antworten wollte ich sicherstellen, dass meine Umgebungseinstellung für ASP.NET Core 2.1 in allen Bereitstellungen beibehalten wird, aber auch nur für die bestimmte Site gilt.
Gemäß der Dokumentation von Microsoft ist es möglich, die Umgebungsvariable im App-Pool mithilfe des folgenden PowerShell-Befehls in IIS 10 festzulegen:
$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
Ich muss leider immer noch IIS 8.5 verwenden und dachte, ich hätte kein Glück. Es ist jedoch immer noch möglich, ein einfaches PowerShell-Skript auszuführen, um einen standortspezifischen Wert für die Umgebungsvariable für ASPNETCORE_ENVIRONMENT festzulegen:
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 }
Auf github gibt es ein gut dokumentiertes Tool für xdt-Transformationen . Auch hängt es nicht vom Befehl ab, sowohl Dotnet Publish als auch Dotnet Msbuild funktionieren einwandfrei.
Sie müssen verschiedene web.config-Dateien wie web.debug.cofig, web.release.config usw. erstellen. Auf dieser Grundlage können Sie einfach Ihre eigene Umgebungsvariable festlegen.
Ich habe ein Repository für die Veröffentlichung von IIS mit der Umgebungskonfiguration in Web.config erstellt.
https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment
Abgesehen von den oben genannten Optionen gibt es eine Reihe anderer Lösungen, die gut mit automatisierten Bereitstellungen funktionieren oder weniger Konfigurationsänderungen erfordern.
1. Ändern der Projektdatei (.CsProj) -Datei
MSBuild unterstützt die EnvironmentName
-Eigenschaft, die dabei helfen kann, die richtige Umgebungsvariable für die Umgebung festzulegen, die Sie bereitstellen möchten. Der Umgebungsname wird während der Veröffentlichungsphase in der Datei web.config hinzugefügt.
Öffnen Sie einfach die Projektdatei (* .csProj) und fügen Sie das folgende XML hinzu.
<!-- 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>
Der obige Code würde den Umgebungsnamen als Development
für die Debug-Konfiguration hinzufügen oder wenn keine Konfiguration angegeben ist. Für jede andere Konfiguration wäre der Umgebungsname Production
in der generierten Datei web.config. Weitere Details hier
2. Hinzufügen der EnvironmentName-Eigenschaft in den Veröffentlichungsprofilen.
Wir können die <EnvironmentName>
-Eigenschaft auch im Veröffentlichungsprofil hinzufügen. Öffnen Sie die Veröffentlichungsprofildatei, die sich unter Properties/PublishProfiles/{profilename.pubxml}
befindet. Dadurch wird der Umgebungsname in web.config festgelegt, wenn das Projekt veröffentlicht wird. Mehr Details hier
<PropertyGroup>
<EnvironmentName>Development</EnvironmentName>
</PropertyGroup>
3. Befehlszeilenoptionen mit dotnet publish
Darüber hinaus können wir die Eigenschaft EnvironmentName
als Befehlszeilenoption an den Befehl dotnet publish
übergeben. Der folgende Befehl würde die Umgebungsvariable als Development
in die Datei web.config aufnehmen.
dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
Um die Details zu dem Fehler zu erhalten, musste ich ASPNETCORE_ENVIRONMENT
Umgebungsvariable für den entsprechenden Anwendungspool system.applicationHost/applicationPools
hinzufügen hinzufügen.
Hinweis: In meinem Fall war die Webanwendung ASP.NET Core 2
auf IIS 10
gehostete Webanwendung. Dies kann über Configuration Editor
in IIS Manager
erfolgen (siehe Bearbeiten von Sammlungen mit dem Konfigurationseditor , um herauszufinden, wo sich dieser Editor in IIS Manager
befindet).