it-swarm.com.de

In IIS veröffentlichen, Umgebungsvariable einstellen

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?

99
drpdrp

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.

  1. Gehen Sie zu Ihrer Anwendung in IIS und wählen Sie Configuration Editor.
  2. Configuration Editor auswählen 
  3. Wählen Sie system.webServer/aspNetCore (RC2 und RTM) oder system.webServer/httpPlatform (RC1) im Kombinationsfeld Section
  4. Wählen Sie Applicationhost.config ... im Kombinationsfeld From.
  5. Klicken Sie auf enviromentVariables Element und öffnen Sie das Bearbeitungsfenster.
  6. Legen Sie Ihre Umgebungsvariablen fest.
  7. Schließen Sie das Fenster und klicken Sie auf Übernehmen.
  8. Erledigt

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.

218
NickAb

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

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:

  • Fügen Sie in Ihrer project.json Befehle hinzu, die die Variable ASPNET_ENV direkt an Kestrel übergeben:

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

  • Verwenden Sie beim Veröffentlichen die Option --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.

21
Joshua Barron

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:

  1. Erstellen Sie einen neuen Windows-Benutzer, z. B. StagingPool auf dem Server.
  2. Erstellen Sie für diesen Benutzer die neue Benutzervariable ASPNETCORE_ENVIRONMENT mit dem Wert 'Staging' (Sie können dies tun, indem Sie sich als dieser Benutzer oder über regedit anmelden.)
  3. Suchen Sie als Administrator im IIS - Manager den Anwendungspool, unter dem das Staging-Web ausgeführt wird, und legen Sie unter Erweiterte Einstellungen die Identität auf Benutzer StagingPool fest.
  4. Setzen Sie außerdem Load User Profile auf true, damit die Umgebungsvariablen geladen werden. <- sehr wichtig!
  5. Stellen Sie sicher, dass StagingPool Zugriffsrechte für den Webordner besitzt und den Anwendungspool stoppen und starten.

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 /?
16
drpdrp

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:

 enter image description here

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.

14

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

7
Christian

@tredder-Lösung mit der Bearbeitung von applicationHost.config funktioniert, wenn Sie mehrere verschiedene Anwendungen in virtuellen Verzeichnissen in IIS haben.

Mein Fall ist:

  • Ich habeAPIproject undAPPproject unter derselben Domäne in verschiedenen virtuellen Verzeichnissen 
  • Die HauptseiteXXXscheint die Variable ASPNETCORE_ENVIRONMENT nicht an ihre Kinder in virtuellen Verzeichnissen weiterzuleiten und ...
  • ... Ich kann die Variablen innerhalb des virtuellen Verzeichnisses nicht als @NickAb beschreiben (erhaltener Fehler Die Anforderung wird nicht unterstützt. (Ausnahme von HRESULT: 0x80070032) beim Speichern von Änderungen im Konfigurationseditor):
  • 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.

5
Bartosz Lenar

Was Sie an einem Ort wissen müssen:

  • Damit Umgebungsvariablen alle Konfigurationseinstellungen überschreiben können, muss ihnen ASPNETCORE_ vorangestellt werden. 
  • Wenn Sie untergeordnete Knoten in Ihrer JSON-Konfiguration abgleichen möchten, verwenden Sie : als Trennzeichen. Wenn die Plattform keine Doppelpunkte in Schlüsseln der Umgebungsvariablen erlaubt, verwenden Sie stattdessen __.
  • Sie möchten, dass Ihre Einstellungen in 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.

  • Um Ihre aktuellen Einstellungen aufzulisten (kombiniert mit Werten aus Web.config): %systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
  • Wenn Sie den Befehl ausführen, um einen Konfigurationsschlüssel mehrmals für denselben Schlüssel festzulegen, wird er mehrmals hinzugefügt! Um einen vorhandenen Wert zu entfernen, verwenden Sie etwas wie %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

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>
3
Sheldon Nunes

Ä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 }
2
dasch88

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.

0
Anik Saha

Ich habe ein Repository für die Veröffentlichung von IIS mit der Umgebungskonfiguration in Web.config erstellt.

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • Konfiguration
    • Holen Sie sich die Abschnitte aus den Dateien .csproj und .user.csproj in Ihre Projektdateien.
    • Laden Sie die Dateien MyAspNetEnvironment.props, web.development.config und web.production.config herunter.
  • Aufbau
    • Ändern Sie den Wert der Eigenschaft ASPNETCORE_ENVIRONMENT in user.csproj entsprechend.
0
subcoder

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

0
Abhinav Galodha

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

0
Dmitry Pavlov