Pubblica su IIS, impostando Variabile d’ambiente

Leggendo queste due domande / risposte sono stato in grado di eseguire un’app Asp.net 5 sul server IIS 8.5.

Asp.net vNext early beta 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 Development valore 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?

Questa risposta è stata originariamente scritta per ASP.NET Core RC1. In RC2, ASP.NET Core è passato dal gestore generico httpPlafrom 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) nella Section combobox
  4. Scegli Applicationhost.config ... in From combobox.
  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” poiché dovrai chiamare dnu publish separatamente per ciascun ambiente, invece di pubblicare una volta e distribuire le dnu publish risultanti più volte.

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

Aggiornato per RTM e RC2

Aggiorna web.config con una sezione in

          

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.

                   

Modifica: a partire da rilasci RC2 e RTM, 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 ciascun 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 utenti IIS aggiuntivi.

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 passo (per abilitare il valore ‘Staging’ per il Web di staging) è stato piuttosto più difficile da far funzionare correttamente, ma eccolo qui:

  1. Creare 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. Indietro come amministratore nel gestore IIS, trovare il pool di applicazioni in cui è in esecuzione il Web di gestione temporanea e in Impostazioni avanzate impostare Id quadro su utente StagingPool .
  4. Imposta anche Carica profilo utente su true , quindi vengono caricate le variabili di ambiente. <- molto importante!
  5. Assicurarsi che StagingPool disponga dei diritti di accesso alla cartella Web e Interrompi e avvii il pool di applicazioni.

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

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

 >setx /? 

Ho le mie applicazioni web (PRODUCTION, STAGING, TEST) ospitate sul server web IIS. Quindi non è stato ansible 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:

inserisci la descrizione dell'immagine qui

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" 

Dopodiché, nel file Program.cs recupera questo valore e quindi 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(); // 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.

Per estendere la risposta di @ tredder puoi modificare le appcmd 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

@tredder solution con l’ applicazione di modificaHost.config è quella che funziona se hai diverse applicazioni localizzate all’interno di directory virtuali su IIS.

Il mio caso è:

  • Ho un progetto API e un progetto APP , sotto lo stesso dominio, collocato in diverse directory virtuali
  • La pagina radice XXX non 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 descritto in @NickAb (ottenuto errore La richiesta non è supportata. (Eccezione da HRESULT: 0x80070032) durante il salvataggio delle modifiche nell’Editor di configurazione):
  • Entrando in applicationHost.config e creando manualmente nodes come questo:

e riavviare IIS ha fatto il lavoro.

Quello che devi sapere in un unico posto:

  • Affinché le variabili di ambiente ASPNETCORE_ impostazioni di configurazione, devono essere precedute da ASPNETCORE_ .
  • Se vuoi abbinare i nodes 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 di IIS causerà la scrittura degli input sul 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, utilizzare 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 .

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 l’applicazione Web ASP.NET Core 2 ospitata su IIS 10 . Può essere fatto tramite Configuration Editor in IIS Manager (vedere Modifica delle collezioni con Configuration Editor per capire dove trovare questo editor in IIS Manager ).

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

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • 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.
  • Modificare il valore della proprietà ASPNETCORE_ENVIRONMENT in user.csproj in modo pertinente.

C’è uno strumento ben documentato su github per le trasformazioni xdt . 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.