Beim Lesen dieser beiden Fragen / Antworten konnte ich eine Asp.net 5-App auf einem IIS 8.5-Server ausführen.
Asp.net vNext frühe Beta-Veröffentlichung auf IIS in Windows Server
Wie konfiguriere ich eine MVC6-App für die Arbeit mit IIS?
Das Problem ist, dass die Web-App auch unter IIS noch env.EnvironmentName
mit Wert verwendet wird Development
.
Außerdem möchte ich zwei Versionen desselben Webs (Staging, Produktion) auf demselben Server ausführen. Daher benötige ich eine Methode, um die Variable für jedes Web separat festzulegen.
Wie macht man das?
Properties\launchSettings.json
zu simulieren eine andere Umgebung für das Debuggen in Visual Studio.Antworten:
Diese Antwort wurde ursprünglich für ASP.NET Core RC1 geschrieben. In RC2 wurde ASP.NET Core vom generischen httpPlafrom-Handler zum aspnetCore-spezifischen verschoben. 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 den Benutzer festgelegt oder mehrere Befehlseinträge erstellt werden müssen.
Configuration Editor
.Configuration Editor
system.webServer/aspNetCore
(RC2 und RTM) odersystem.webServer/httpPlatform
(RC1)Section
Applicationhost.config ...
in derFrom
Combobox.enviromentVariables
Element, wählen Sie'environmentVariables' element
dann ausEdit Items
.Auf diese Weise müssen Sie keine speziellen Benutzer für Ihren Pool erstellen oder zusätzliche Befehlseinträge in erstellen
project.json
. Wenn Sie spezielle Befehle für jede Umgebung hinzufügen, wird "einmal erstellen, mehrmals bereitstellen" unterbrochen, da Siednu publish
für jede Umgebung separat aufrufen müssen, anstatt einmal zu veröffentlichen und das resultierende Artefakt mehrmals bereitzustellen.Dank Mark G und Tredder für RC2 und RTM aktualisiert.
quelle
system.webServer/aspNetCore
stattdessen verwendet.Aktualisieren Sie web.config mit einem Abschnitt <environmentVariables> unter <aspNetCore>
Um zu vermeiden, dass diese Einstellung beim Überschreiben von web.config verloren geht, nehmen Sie ähnliche Änderungen an applicationHost.config vor und geben Sie den Speicherort der Site an, wie von @NickAb vorgeschlagen.
quelle
Target configuration object '/system.webServer/aspNetCore/environmentVariables/environmentVariable is not found ...
Normalerweise bekomme ich eine Variable. Ich würde so etwas schreiben:Set-WebConfigurationProperty -PSPath IIS:\ -location example.com -filter /system.webServer/aspNetCore/environmentVariables/environmentVariable -name ASPNETCORE_ENVIRONMENT -value Staging
Was fehlt mir?appcmd
stattdessen.Set-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
Bearbeiten: Ab RC2- und RTM-Versionen ist dieser Hinweis veraltet. Der beste Weg, dies in der Version zu erreichen, besteht darin, die folgenden Abschnitte von web.config in IIS für jede Umgebung zu bearbeiten:
system.webServer/aspNetCore
::Bearbeiten Sie den Eintrag environmentVariable und fügen Sie eine Einstellung für Umgebungsvariablen hinzu:
ASPNETCORE_ENVIRONMENT
::< Your environment name >
Als Alternative zum Ansatz von drpdrp können Sie Folgendes tun:
Fügen Sie in Ihrer project.json Befehle hinzu, die die Variable ASPNET_ENV direkt an Kestrel übergeben:
Verwenden Sie beim Veröffentlichen die
--iis-command
Option, um eine Umgebung anzugeben:Ich fand diesen Ansatz weniger aufdringlich als das Erstellen zusätzlicher IIS-Benutzer.
quelle
Ich habe meine Webanwendungen (PRODUCTION, STAGING, TEST) auf dem IIS-Webserver gehostet. Daher war es nicht möglich, sich auf die Systemumgebungsvariable des ASPNETCORE_ENVIRONMENT-Agenten zu verlassen, da sich das Festlegen eines bestimmten Werts (z. B. STAGING) auf andere Anwendungen auswirkt.
Als Workaround habe ich eine benutzerdefinierte Datei (envsettings.json) in meiner Visualstudio-Lösung definiert:
mit folgendem Inhalt:
Dann setze ich diese Datei basierend auf meinem Anwendungstyp (Produktion, Staging oder Test) entsprechend ein: Angenommen, ich stelle die TEST-Anwendung bereit, habe ich:
Rufen Sie danach in der Datei Program.cs einfach diesen Wert ab und legen Sie die Umgebung des webHostBuilder fest:
Denken Sie daran, die Datei envsettings.json in die PublishOptions (project.json) aufzunehmen:
Mit dieser Lösung kann ich die ASP.NET CORE-Anwendung unabhängig vom Wert der Umgebungsvariablen auf demselben IIS hosten lassen.
quelle
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 Produktion zu setzen und den Windows Server neu zu starten . Danach erhalten alle Web-Apps den Wert 'Produktion' als Umgebungsname.
Der zweite Schritt (um den Wert 'Staging' für das Staging von Web zu aktivieren) war etwas schwieriger, um richtig zu arbeiten, aber hier ist es:
Jetzt sollte im Staging-Web der Umgebungsname auf "Staging" gesetzt sein.
Update: In Windows 7+ gibt es einen Befehl , mit dem Umgebungsvariablen über die CMD-Eingabeaufforderung auch für einen bestimmten Benutzer festgelegt werden können. Dies gibt Hilfe plus Beispiele aus:
quelle
Alternativ können Sie den gewünschten
ASPNETCORE_ENVIRONMENT
Befehl als Argument an den Befehl dotnet Publish übergeben:z.B:
Dadurch wird die web.config mit der für Ihr Projekt angegebenen korrekten Umgebung generiert:
quelle
Abgesehen von den oben genannten Optionen gibt es einige andere Lösungen, die mit automatisierten Bereitstellungen gut funktionieren oder weniger Konfigurationsänderungen erfordern.
1. Ändern der Projektdatei (.CsProj)
MSBuild unterstützt die
EnvironmentName
Eigenschaft, mit deren Hilfe Sie die richtige Umgebungsvariable für die Umgebung festlegen können, 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.
Der obige Code fügt den Umgebungsnamen wie
Development
bei der Debug-Konfiguration hinzu oder wenn keine Konfiguration angegeben ist. Bei jeder anderen Konfiguration befindet sich der UmgebungsnameProduction
in der generierten Datei web.config. Weitere Details hier2. 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 unterProperties/PublishProfiles/{profilename.pubxml}
Dies wird der Umgebungsname in web.config festgelegt, wenn das Projekt veröffentlicht wird. Weitere Details hier3. Befehlszeilenoptionen mit Dotnet Publish
Zusätzlich können wir die Eigenschaft
EnvironmentName
als Befehlszeilenoption an dendotnet publish
Befehl übergeben. Der folgende Befehl würde die Umgebungsvariable wieDevelopment
in der Datei web.config enthalten.dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
quelle
Um die Antwort von @ tredder zu erweitern, können Sie die Umgebungsvariablen mit ändern
appcmd
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
quelle
Was Sie an einem Ort wissen müssen:
ASPNETCORE_
.:
als Trennzeichen. Wenn die Plattform keine Doppelpunkte in Umgebungsvariablenschlüsseln zulässt, verwenden Sie__
stattdessen.ApplicationHost.config
. Wenn Sie den IIS-Konfigurationseditor verwenden, werden Ihre Eingaben in die Anwendung geschriebenWeb.config
- und bei der nächsten Bereitstellung überschrieben!Zum Ändern
ApplicationHost.config
möchten Sieappcmd.exe
sicherstellen, 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 wie
%u007b
bei der linken geschweiften Klammer als Unicode maskiert werden.%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
.quelle
/commit:site
den Änderungen in der web.config geschrieben werden, um sie in der zu speichern,ApplicationHost.config
sollte man verwenden/commit:apphost
-section:system.webServer/aspNetCore /-"environmentVariables.
(mit Minus zum Entfernen der Umgebungsvariablen) kann während der Azure-Release-Pipeline nicht ausgeführt werden. Der Fehler isthresult:80070032, message:Command execution failed
. Funktioniert jedochclear config "Default Web Site/$(webSiteName)" -section:system.webServer/aspNetCore /commit:site
gut. Es löscht den gesamten aspNetCore-Abschnitt für die Website, ist jedoch kein Problem, da er während der Veröffentlichung parametrisiert wird.Die @ tredder-Lösung mit der Bearbeitung von applicationHost.config funktioniert, wenn sich mehrere verschiedene Anwendungen in virtuellen Verzeichnissen auf IIS befinden.
Mein Fall ist:
Gehen Sie in applicationHost.config und erstellen Sie Knoten wie folgt manuell:
<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 ein Neustart des IIS hat den Job erledigt.
quelle
Ähnlich wie bei anderen Antworten wollte ich sicherstellen, dass meine ASP.NET Core 2.1-Umgebungseinstellung über Bereitstellungen hinweg erhalten bleibt, aber auch nur auf die bestimmte Site angewendet wird.
Gemäß der Dokumentation von Microsoft ist es möglich, die Umgebungsvariable im App-Pool mit dem folgenden PowerShell-Befehl in IIS 10 festzulegen:
Ich muss leider immer noch IIS 8.5 verwenden und dachte, ich hätte kein Glück. Es ist jedoch weiterhin möglich, ein einfaches PowerShell-Skript auszuführen, um einen standortspezifischen Umgebungsvariablenwert für ASPNETCORE_ENVIRONMENT festzulegen:
quelle
Um die Details zu dem Fehler zu erhalten, musste ich eine
ASPNETCORE_ENVIRONMENT
Umgebungsvariable für den entsprechenden Anwendungspool hinzufügensystem.applicationHost/applicationPools
.Hinweis: Die Webanwendung in meinem Fall war eine
ASP.NET Core 2
Webanwendung, auf der gehostet wurdeIIS 10
. Dies kann überConfiguration Editor
in erfolgenIIS Manager
(siehe Bearbeiten von Sammlungen mit dem Konfigurationseditor, um herauszufinden, wo sich dieser Editor befindetIIS Manager
).quelle
Ich habe ein Repository zum Veröffentlichen von IIS mit der Umgebungskonfiguration in Web.config erstellt.
https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment
quelle
Ich habe die Antwort geändert, die @Christian Del Bianco gegeben wird. Ich habe den Prozess für .net Core 2 und höher als project.json-Datei jetzt absolut geändert.
Erstellen Sie zunächst die Datei appsettings.json im Stammverzeichnis. mit dem Inhalt
Erstellen Sie dann zwei weitere Einstellungsdateien appsettings.Development.json und appsettings.Production.json mit der erforderlichen Konfiguration.
Fügen Sie den erforderlichen Code zum Einrichten der Umgebung zur Datei Program.cs hinzu .
}}
Fügen Sie die Datei envsettings.json zu Ihrer .csproj- Datei hinzu, um sie in das veröffentlichte Verzeichnis zu kopieren.
Ändern Sie nun einfach das ASPNETCORE_ENVIRONMENT wie gewünscht in der Datei envsettings.json und veröffentlichen Sie es.
quelle