it-swarm-eu.dev

Pubblica su IIS, impostando Variabile d'ambiente

Leggendo queste due domande/risposte sono riuscito a eseguire un'app Asp.net 5 su server IIS 8.5.

Asp.net vNext beta precoce pubblica su IIS in windows server

Come configurare un'app MVC6 per funzionare su IIS?

Il problema è che l'app Web sta ancora utilizzando env.EnvironmentName con valore Development anche quando è in esecuzione su IIS.

Inoltre, voglio eseguire due versioni dello stesso Web (Staging, Production) sullo stesso server, quindi ho bisogno di un metodo per impostare separatamente la variabile per ogni Web.

Come fare questo?

99
drpdrp

Questa risposta è stata originariamente scritta per ASP.NET Core RC1. In RC2, il nucleo di ASP.NET si è spostato dal gestore HTTPPlafrom generico a quello specifico di aspnetCore. Tieni presente che il passaggio 3 dipende dalla versione di ASP.NET Core che stai utilizzando.

Risolve le variabili di ambiente per i progetti ASP.NET Core può essere impostato senza dover impostare le variabili di ambiente per l'utente o dover creare più voci di comandi.

  1. Vai alla tua applicazione in IIS e scegli Configuration Editor.
  2. Seleziona Configuration Editor 
  3. Scegli system.webServer/aspNetCore (RC2 e RTM) o system.webServer/httpPlatform (RC1) in Section combobox
  4. Scegli Applicationhost.config ... nella casella combo From.
  5. Fare clic sull'elemento enviromentVariables e aprire la finestra di modifica.
  6. Imposta le tue variabili di ambiente.
  7. Chiudi la finestra e fai clic su Applica.
  8. Fatto

In questo modo non devi creare utenti speciali per il tuo pool o creare voci di comandi extra in project.json. Inoltre, l'aggiunta di comandi speciali per ogni ambiente interrompe "build once, deploy many times" come dovrai chiamare dnu publish separatamente per ogni ambiente, invece di pubblicare una sola volta e distribuire il manufatto risultante molte volte.

Aggiornato per RC2 e RTM, grazie a Mark G e tredder.

218
NickAb

Aggiorna web.config con un <environmentVariables> section in <aspNetCore>

<configuration>
  <system.webServer>
    <aspNetCore .....>
      <environmentVariables>
        <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
      </environmentVariables>
    </aspNetCore>
  </system.webServer>
</configuration>

O per evitare di perdere questa impostazione quando si sovrascrive web.config, apportare modifiche simili a applicationHost.config specificando la posizione del sito come suggerisce @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>
28
tredder

Modifica: a partire da RC2 e RTM versioni, questo consiglio non è aggiornato. Il modo migliore che ho trovato per ottenere questo risultato nel rilascio è modificare le seguenti sezioni web.config in IIS per ogni ambiente:

system.webServer/aspNetCore

Modificare la voce environment variable e aggiungere un'impostazione di variabile di ambiente:

ASPNETCORE_ENVIRONMENT: < Your environment name >


In alternativa all'approccio di drpdrp, puoi fare quanto segue:

  • Nel tuo project.json, aggiungi i comandi che passano la variabile ASPNET_ENV direttamente a Kestrel:

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

  • Durante la pubblicazione, utilizzare l'opzione --iis-command per specificare un ambiente:

dnu publish --configuration Debug --iis-command Staging --out "outputdir" --runtime dnx-clr-win-x86-1.0.0-rc1-update1

Ho trovato questo approccio meno invadente rispetto alla creazione di altri utenti IIS.

21
Joshua Barron

Dopo lunghe ricerche su google ho trovato una soluzione funzionante, che consiste in due passaggi.

Il primo passaggio consiste nel impostare la variabile di ambiente di sistema ASPNET_ENV su Produzione e Riavviare Windows Server. Dopodiché, tutte le app Web acquisiscono il valore 'Produzione' come EnvironmentName.

Il secondo passaggio (per abilitare il valore 'Staging' per il Web di staging) è stato piuttosto più difficile da far funzionare correttamente, ma eccolo qui:

  1. Crea un nuovo utente windows, ad esempio StagingPool sul server.
  2. Per questo utente, crea una nuova variabile utente ASPNETCORE_ENVIRONMENT con valore 'Staging' (puoi farlo accedendo come utente o tramite regedit)
  3. Torna come amministratore nel gestore IIS, trova il Pool di applicazioni in cui è in esecuzione il Web di Staging e in Impostazioni avanzate imposta Identità su utente StagingPool.
  4. Imposta anche Carica profilo utente su true, quindi vengono caricate le variabili di ambiente. <- molto importante!
  5. Assicurati che StagingPool disponga dei diritti di accesso alla cartella web e fermi e avvii il pool di applicazioni.

Ora il web di Staging dovrebbe avere l'EnvironmentName impostato su 'Staging'.

Aggiornamento: in Windows 7+ è presente un comando che può impostare le variabili di ambiente da CMD Prompt anche per un utente specificato. Queste uscite aiutano più campioni:

>setx /?
16
drpdrp

Ho le mie applicazioni web (PRODUCTION, STAGING, TEST) ospitate sul server web IIS. Quindi non è stato possibile fare affidamento sulla variabile di ambiente del sistema operativo ASPNETCORE_ENVIRONMENT, perché impostarla su un valore specifico (ad esempio STAGING) ha effetto su altre applicazioni. 

Come soluzione, ho definito un file personalizzato (envsettings.json) all'interno della mia soluzione visualstudio:

 enter image description here

con il seguente contenuto:

{
  // Possible string values reported below. When empty it use ENV variable value or Visual Studio setting.
  // - Production
  // - Staging
  // - Test
  // - Development
  "ASPNETCORE_ENVIRONMENT": ""
}

Quindi, in base al tipo di applicazione (Produzione, Staging o Test), imposto questo file in modo corretto: supponendo che sto distribuendo l'applicazione TEST, avrò:

"ASPNETCORE_ENVIRONMENT": "Test"

Successivamente, nel file Program.cs recupera questo valore e imposta l'ambiente 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();
        }
    }

Ricordati di includere envsettings.json nelle publishOptions (project.json):

  "publishOptions":
  {
    "include":
    [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "envsettings.json",
      "appsettings.json",
      "appsettings*.json",
      "web.config"
    ]
  },

Questa soluzione mi rende libero di avere l'applicazione ASP.NET CORE ospitata sullo stesso IIS, indipendentemente dal valore della variabile ambientale.

14

Per estendere la risposta di @ tredder puoi modificare le variabili environment usando appcmd

Messa in scena

%windir%\system32\inetsrv\appcmd set config "staging.example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Staging'] /commit:APPHOST

Produzione

%windir%\system32\inetsrv\appcmd set config "example.com" /section:system.webServer/aspNetCore /+environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production'] /commit:APPHOST

7
Christian

@tredder solution con editing applicationHost.config è quello che funziona se hai diverse applicazioni localizzate all'interno di directory virtuali su IIS.

Il mio caso è:

  • HoAPIproject eAPPproject, sotto lo stesso dominio, collocato in diverse directory virtuali 
  • La pagina di rootXXXnon sembra propagare la variabile ASPNETCORE_ENVIRONMENT ai suoi figli nelle directory virtuali e ...
  • ... Non riesco a impostare le variabili all'interno della directory virtuale come @NickAb descritto (ottenuto errore La richiesta non è supportata. (Eccezione da HRESULT: 0x80070032) durante il salvataggio delle modifiche in Configuration Editor:
  • Entrando in applicationHost.config e creando manualmente nodi come questo:

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

e il riavvio di IIS ha fatto il lavoro.

5
Bartosz Lenar

Cosa devi sapere in un unico posto:

  • Affinché le variabili di ambiente ignorino le impostazioni di configurazione, devono essere precedute da ASPNETCORE_
  • Se vuoi abbinare i nodi figli nella tua configurazione JSON, usa : come separatore. Se la piattaforma non consente i due punti nelle chiavi delle variabili di ambiente, utilizzare invece __.
  • Vuoi che le tue impostazioni finiscano in ApplicationHost.config. L'utilizzo dell'Editor di configurazione IIS causerà la scrittura degli input nel Web.config dell'applicazione e verrà sovrascritto con la prossima distribuzione!
  • Per modificare ApplicationHost.config, si desidera utilizzare appcmd.exe per assicurarsi che le modifiche siano coerenti. Esempio: %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

  • I caratteri che non sono sicuri dell'URL possono essere sfuggiti come Unicode, come %u007b per parentesi graffa sinistra.

  • Per elencare le impostazioni correnti (combinate con i valori di Web.config): %systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
  • Se si esegue il comando per impostare una chiave di configurazione più volte per la stessa chiave, questa verrà aggiunta più volte! Per rimuovere un valore esistente, usa qualcosa come %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

In alternativa, puoi passare il ASPNETCORE_ENVIRONMENT desiderato nel comando dotnet publish come argomento usando: 

/p:EnvironmentName=Staging

per esempio.:

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

Questo genererà il web.config con l'ambiente corretto specificato per il tuo progetto:

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

Analogamente ad altre risposte, volevo assicurarmi che l'impostazione dell'ambiente ASP.NET Core 2.1 fosse persistente tra le distribuzioni, ma anche applicata al sito specifico.

Secondo la documentazione di Microsoft, è possibile impostare la variabile di ambiente nel pool di app utilizzando il seguente comando di PowerShell in 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

Sfortunatamente devo ancora usare IIS 8.5 e ho pensato di essere sfortunato. Tuttavia, è ancora possibile eseguire un semplice script PowerShell per impostare un valore variabile di ambiente specifico del sito per 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 }
2
dasch88

C'è uno strumento ben documentato su github per xdt-transformations . Inoltre non dipende dal comando, entrambi dotnet publish e dotnet msbuild funzionano bene. 

Devi creare diversi file web.config come web.debug.cofig, web.release.config ecc. In base a ciò puoi facilmente impostare la tua variabile d'ambiente.

0
Anik Saha

Ho creato un repository per la pubblicazione IIS con la configurazione dell'ambiente in Web.config.

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • Impostare
    • Ottieni le sezioni dai file .csproj e .user.csproj nei file di progetto.
    • Ottieni i file MyAspNetEnvironment.props, web.development.config e web.production.config.
  • Configurazione
    • Modificare il valore della proprietà ASPNETCORE_ENVIRONMENT in user.csproj in modo pertinente.
0
subcoder

Oltre alle opzioni sopra menzionate, ci sono un paio di altre soluzioni che funzionano bene con le distribuzioni automatizzate o richiedono un minor numero di modifiche alla configurazione.

1. Modifica del file di progetto (file .CsProj) 

MSBuild supporta la proprietà EnvironmentName che può aiutare a impostare la giusta variabile d'ambiente secondo l'Ambiente che si desidera distribuire. Il nome dell'ambiente verrà aggiunto in web.config durante la fase di pubblicazione.

Basta aprire il file di progetto (* .csProj) e aggiungere il seguente XML.

<!-- 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>

Sopra il codice aggiungerebbe il nome dell'ambiente come Development per la configurazione di debug o se non è stata specificata alcuna configurazione. Per qualsiasi altra configurazione il nome dell'ambiente sarebbe Production nel file web.config generato. Maggiori dettagli qui

2. Aggiunta della proprietà EnvironmentName nei profili di pubblicazione.

Possiamo anche aggiungere la proprietà <EnvironmentName> nel profilo di pubblicazione. Apri il file del profilo di pubblicazione che si trova su Properties/PublishProfiles/{profilename.pubxml} Questo imposterà il nome dell'ambiente in web.config quando il progetto sarà pubblicato. Maggiori dettagli qui

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

3. Opzioni della riga di comando usando dotnet publish

Inoltre, possiamo passare la proprietà EnvironmentName come opzione della riga di comando al comando dotnet publish. Il seguente comando includerebbe la variabile di ambiente come Development nel file web.config.

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

0
Abhinav Galodha

Per ottenere i dettagli sull'errore ho dovuto aggiungere la variabile d'ambiente ASPNETCORE_ENVIRONMENT per il corrispondente pool di applicazioni system.applicationHost/applicationPools

Nota: l'applicazione web nel mio caso era ASP.NET Core 2 web application ospitata su IIS 10. Può essere fatto tramite Configuration Editor in IIS Manager (vedi Modifica delle collezioni con Configuration Editor per capire dove trovare questo editor in IIS Manager).

0
Dmitry Pavlov