In IIS veröffentlichen und Umgebungsvariable festlegen

133

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.EnvironmentNamemit 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?

drpdrp
quelle
4
In der Regel gibt es drei Netzwerkumgebungen: Entwicklung, Bereitstellung und Produktion. Der Webserver befindet sich in einer Umgebung. Daher ist das Festlegen der Systemumgebungsvariablen für den Server normalerweise keine echte Einschränkung. Man kann immer noch verwenden Properties\launchSettings.jsonzu simulieren eine andere Umgebung für das Debuggen in Visual Studio.
Oleg

Antworten:

283

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.

  1. Gehen Sie zu Ihrer Anwendung in IIS und wählen Sie Configuration Editor.
  2. Wählen Configuration Editor
  3. Wählen Sie in der Combobox system.webServer/aspNetCore(RC2 und RTM) oder system.webServer/httpPlatform(RC1)Section
  4. Wählen Sie Applicationhost.config ...in der FromCombobox.
  5. Klicken Sie mit der rechten Maustaste auf das enviromentVariablesElement, wählen Sie 'environmentVariables' elementdann aus Edit Items. Geben Sie hier die Bildbeschreibung ein
  6. Legen Sie Ihre Umgebungsvariablen fest.
  7. Schließen Sie das Fenster und klicken Sie auf Übernehmen.
  8. Getan

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 Sie dnu publishfü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.

NickAb
quelle
12
Für Schritt 3 habe ich system.webServer/aspNetCorestattdessen verwendet.
Mark G
1
Systemumgebungsvariablen werden beim Start von Prozessen geerbt. Wenn Sie also während der Ausführung Ihrer Anwendung eine env-Variable ändern, können Sie diese Änderungen standardmäßig nicht sehen. Damit Änderungen an der Systemumgebung wirksam werden, müssen Sie mindestens die Site, möglicherweise den Pool oder sogar den IIS-Dienst neu starten, je nachdem, wie IIS Prozesse erstellt. Dies muss getestet werden.
NickAb
7
Werden die über den Konfigurationseditor hinzugefügten Einstellungen bei der nächsten Bereitstellung nicht gelöscht?
Brad Gardner
11
@ brad-gardner Wenn Änderungen an Applicationhost.config anstelle von web.config vorgenommen werden, bleiben die Änderungen zwischen den Bereitstellungen bestehen.
NickAb
15
Funktioniert für Asp.Net Core 2.0
Frank Cannon
34

Aktualisieren Sie web.config mit einem Abschnitt <environmentVariables> 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 und geben Sie den Speicherort der Site an, wie von @NickAb vorgeschlagen.

<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>
Trevor Daniels
quelle
2
Dies unterscheidet sich darin, dass Ihre web.config Teil des Projekts ist und in VCS versioniert ist. Wenn Sie mehrere Umgebungen haben, wie z. B. prod, staging, dev, benötigen Sie eine Möglichkeit, web.config für jede zu transformieren. Das Ändern von ApplicationHost.config in IIS wirkt sich nur auf diesen IIS aus. Damit Sie in Ihrem VCS und in IIS-spezifischen Umgebungsvariablen eine einzelne web.config haben können, die web.config-Variablen überschreibt. ApplicationHost.config kann programmgesteuert mit PowerShell iis.net/learn/manage/powershell/…
NickAb
Dank @NickAb muss die web.config nicht bei jeder Bereitstellung aktualisiert werden. Ich habe meine Antwort aktualisiert.
Trevor Daniels
Ich habe Probleme damit, dies von Powershell aus zu tun. 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?
Christian
Ich ging zurück zu dem, was ich wusste und benutzte es appcmdstattdessen.
Christian
@Christian, überprüfen Sie diese Antwort: stackoverflow.com/a/50869935/33533 Der Name und der Wert der Umgebungsvariablen werden in einer Hash-Tabelle gespeichert. Aus Ihrem Beispiel wäre es alsoSet-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
Curtis Buys
21

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:

    "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 --iis-commandOption, 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.

Joshua Barron
quelle
11
Wenn Sie über msdeploy von Visual Studio veröffentlichen. Anschließend können Sie <IISCommand> Staging </ IISCommand> in Ihre .pubxml-Datei einfügen. Die Bereitstellung erfolgt mit dem angegebenen IIS-Befehl, obwohl Sie ihn in der Veröffentlichungsoberfläche nicht angeben können.
Dean North
@ DeanNorth - Das ist golden !! Funktioniert wie ein Champion! Danke für das Teilen!
S. Rasmussen
17

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:

Geben Sie hier die Bildbeschreibung ein

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 setze ich diese Datei basierend auf meinem Anwendungstyp (Produktion, Staging oder Test) entsprechend ein: Angenommen, ich stelle die TEST-Anwendung bereit, habe ich:

"ASPNETCORE_ENVIRONMENT": "Test"

Rufen Sie danach in der Datei Program.cs einfach diesen Wert ab und legen Sie die Umgebung des 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"
    ]
  },

Mit dieser Lösung kann ich die ASP.NET CORE-Anwendung unabhängig vom Wert der Umgebungsvariablen auf demselben IIS hosten lassen.

Christian Del Bianco
quelle
Sehr schön, die einzige Änderung, die ich vorschlage, ist swap var currentDirectoryPath = Directory.GetCurrentDirectory (); für var currentDirectoryPath = PlatformServices.Default.Application.ApplicationBasePath; Dies ist ein viel sicherer Weg, um das aktuelle Verzeichnis zu erhalten.
Peter Kottas
7
Was für ein großartiges Out-of-the-Box-Erlebnis, wenn Sie eine weitere Ebene von Konfigurationen erstellen müssen, um Konfigurationen eines Frameworks zu verwalten
Kugel
16

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:

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

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:

>setx /?
drpdrp
quelle
1
Es scheint, dass in ASP.NET 5 RC1 die Umgebungsvariable in Hosting: Umgebung geändert wurde.
Grady Werner
Wie setzen wir "Benutzerprofil laden" auf "true", wenn wir dies in Azure Web App bereitstellen?
Puneet Ghanshani
@PunitGanshani Soweit ich weiß, gibt es im Azure-Portal für Webanwendungen einen Abschnitt "Anwendungseinstellungen", in dem Sie Umgebungsschlüssel / Wert-Paare festlegen können
drpdrp
@GradyWerner Für RC2 ändern sie es (ab sofort) zu ASPNET_ENVIRONMENT ;-)
b.pell
1
@ b.pell Es scheint, es ist jetzt ASPNETCORE_ENVIRONMENT :)
Mark G
11

Alternativ können Sie den gewünschten ASPNETCORE_ENVIRONMENTBefehl als Argument an den Befehl dotnet Publish übergeben:

/p:EnvironmentName=Staging

z.B:

dotnet publish /p:Configuration=Release /p:EnvironmentName=Staging

Dadurch wird die web.config mit der für Ihr Projekt angegebenen korrekten Umgebung generiert:

<environmentVariables>
  <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Staging" />
</environmentVariables>
Sheldon Nunes
quelle
9

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 EnvironmentNameEigenschaft, 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.

<!-- 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 fügt den Umgebungsnamen wie Developmentbei der Debug-Konfiguration hinzu oder wenn keine Konfiguration angegeben ist. Bei jeder anderen Konfiguration befindet sich der Umgebungsname Productionin 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 unter Properties/PublishProfiles/{profilename.pubxml}Dies wird der Umgebungsname in web.config festgelegt, wenn das Projekt veröffentlicht wird. Weitere Details hier

<PropertyGroup>
  <EnvironmentName>Development</EnvironmentName>
</PropertyGroup>

3. Befehlszeilenoptionen mit Dotnet Publish

Zusätzlich können wir die Eigenschaft EnvironmentNameals Befehlszeilenoption an den dotnet publishBefehl übergeben. Der folgende Befehl würde die Umgebungsvariable wie Developmentin der Datei web.config enthalten.

dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development

Abhinav Galodha
quelle
7

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

Christian
quelle
Hier erfahren Sie, wie Sie mit Powershell auf einem Build-Server ohne installierten IIS dasselbe erreichen. gist.github.com/markarnott/c4aec1fc544fe89e2bd21f3f00d78933
Mark Arnott
Wenn Sie "staging.example.com" oder "example.com" angeben, wird die Variable nur auf diese bestimmten Websites angewendet. Wenn Sie dies weglassen, wird eine globale Variable für alle Websites auf dem Server erstellt.
tödlicher Hund
6

Was Sie an einem Ort wissen müssen:

  • Damit Umgebungsvariablen Konfigurationseinstellungen überschreiben können, muss ihnen ein Präfix vorangestellt werden ASPNETCORE_.
  • Wenn Sie untergeordnete Knoten in Ihrer JSON-Konfiguration abgleichen möchten, verwenden Sie diese :als Trennzeichen. Wenn die Plattform keine Doppelpunkte in Umgebungsvariablenschlüsseln zulässt, verwenden Sie __stattdessen.
  • Sie möchten, dass Ihre Einstellungen in landen ApplicationHost.config. Wenn Sie den IIS-Konfigurationseditor verwenden, werden Ihre Eingaben in die Anwendung geschrieben Web.config- und bei der nächsten Bereitstellung überschrieben!
  • Zum Ändern ApplicationHost.configmöchten Sie appcmd.exesicherstellen, 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 %u007bbei der linken geschweiften Klammer als Unicode maskiert werden.

  • So listen Sie Ihre aktuellen Einstellungen auf (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 zum mehrfachen Festlegen eines Konfigurationsschlüssels für denselben Schlüssel ausführen, wird er mehrmals hinzugefügt! Verwenden Sie etwas wie, um einen vorhandenen Wert zu entfernen %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.
realMarkusSchmidt
quelle
1
Beachten Sie, dass mit /commit:siteden Änderungen in der web.config geschrieben werden, um sie in der zu speichern, ApplicationHost.configsollte man verwenden/commit:apphost
Angel Yordanov
-section:system.webServer/aspNetCore /-"environmentVariables.(mit Minus zum Entfernen der Umgebungsvariablen) kann während der Azure-Release-Pipeline nicht ausgeführt werden. Der Fehler ist hresult:80070032, message:Command execution failed. Funktioniert jedoch clear config "Default Web Site/$(webSiteName)" -section:system.webServer/aspNetCore /commit:sitegut. Es löscht den gesamten aspNetCore-Abschnitt für die Website, ist jedoch kein Problem, da er während der Veröffentlichung parametrisiert wird.
Oleksa
5

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:

  • Ich habe ein API- Projekt und ein APP- Projekt unter derselben Domäne in verschiedenen virtuellen Verzeichnissen abgelegt
  • Die Stammseite XXX scheint die Variable ASPNETCORE_ENVIRONMENT nicht an ihre untergeordneten Elemente in virtuellen Verzeichnissen und ...
  • ... Ich kann die Variablen im virtuellen Verzeichnis nicht wie beschrieben in @NickAb festlegen (Fehler erhalten Die Anforderung wird nicht unterstützt (Ausnahme von HRESULT: 0x80070032), während Änderungen im Konfigurationseditor gespeichert werden ):
  • 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.

Bartosz Lenar
quelle
5

Ä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:

$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 weiterhin möglich, ein einfaches PowerShell-Skript auszuführen, um einen standortspezifischen Umgebungsvariablenwert 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 }
dasch88
quelle
0

Um die Details zu dem Fehler zu erhalten, musste ich eine ASPNETCORE_ENVIRONMENTUmgebungsvariable für den entsprechenden Anwendungspool hinzufügensystem.applicationHost/applicationPools .

Hinweis: Die Webanwendung in meinem Fall war eine ASP.NET Core 2Webanwendung, auf der gehostet wurde IIS 10. Dies kann über Configuration Editorin erfolgen IIS Manager(siehe Bearbeiten von Sammlungen mit dem Konfigurationseditor, um herauszufinden, wo sich dieser Editor befindet IIS Manager).

Dmitry Pavlov
quelle
0

Ich habe ein Repository zum Veröffentlichen 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.
    • Rufen Sie die Dateien MyAspNetEnvironment.props, web.development.config und web.production.config ab.
  • Aufbau
    • Ändern Sie den Wert der Eigenschaft ASPNETCORE_ENVIRONMENT in user.csproj entsprechend.
Subcoder
quelle
Dies scheint keine qualitativ hochwertige Antwort auf die Frage zu liefern . Bitte bearbeiten Sie entweder Ihre Antwort, indem Sie die allgemeinen Details dieser Lösung hinzufügen, oder entfernen Sie sie einfach und veröffentlichen Sie sie als Kommentar zur Frage. Vielen Dank!
sɐunıɔ ןɐ qɐp
0

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.

  1. Erstellen Sie zunächst die Datei appsettings.json im Stammverzeichnis. mit dem Inhalt

      {
         // Possible string values reported below. When empty it use ENV 
            variable value or Visual Studio setting.
         // - Production
         // - Staging
         // - Test
        // - Development
       "ASPNETCORE_ENVIRONMENT": "Development"
     }
    
  2. Erstellen Sie dann zwei weitere Einstellungsdateien appsettings.Development.json und appsettings.Production.json mit der erforderlichen Konfiguration.

  3. Fügen Sie den erforderlichen Code zum Einrichten der Umgebung zur Datei Program.cs hinzu .

    public class Program
    {
    public static void Main(string[] args)
    {
        var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
    
      ***var currentDirectoryPath = Directory.GetCurrentDirectory();
        var envSettingsPath = Path.Combine(currentDirectoryPath, "envsettings.json");
        var envSettings = JObject.Parse(File.ReadAllText(envSettingsPath));
        var enviromentValue = envSettings["ASPNETCORE_ENVIRONMENT"].ToString();***
    
        try
        {
            ***CreateWebHostBuilder(args, enviromentValue).Build().Run();***
        }
        catch (Exception ex)
        {
            //NLog: catch setup errors
            logger.Error(ex, "Stopped program because of setup related exception");
            throw;
        }
        finally
        {
            NLog.LogManager.Shutdown();
        }
    }
    
    public static IWebHostBuilder CreateWebHostBuilder(string[] args, string enviromentValue) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .ConfigureLogging(logging =>
            {
                logging.ClearProviders();
                logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
            })
            .UseNLog()
            ***.UseEnvironment(enviromentValue);***
    

    }}

  4. Fügen Sie die Datei envsettings.json zu Ihrer .csproj- Datei hinzu, um sie in das veröffentlichte Verzeichnis zu kopieren.

       <ItemGroup>
            <None Include="envsettings.json" CopyToPublishDirectory="Always" />
        </ItemGroup>
    
  5. Ändern Sie nun einfach das ASPNETCORE_ENVIRONMENT wie gewünscht in der Datei envsettings.json und veröffentlichen Sie es.

Md. Nazrul Islam
quelle