Publicar no IIS, definindo a variável de ambiente

Lendo essas duas perguntas / respostas, consegui executar um aplicativo Asp.net 5 no servidor IIS 8.5.

Asp.net vNext beta anterior publicar para o IIS no servidor windows

Como configurar um aplicativo MVC6 para funcionar no IIS?

O problema é que o aplicativo da Web ainda está usando env.EnvironmentName com o valor Development mesmo quando executado no IIS.

Além disso, eu quero executar duas versões da mesma Web (Staging, Production) no mesmo servidor, então eu preciso de um método para definir a variável para cada Web separadamente.

Como fazer isso?

Esta resposta foi originalmente escrita para o ASP.NET Core RC1. No RC2 ASP.NET Core mudou de manipulador httpPlafrom genérico para um específico aspnetCore. Observe que a etapa 3 depende de qual versão do ASP.NET Core você está usando.

Desvende as variables ​​de ambiente para o ASP.NET Os projetos do Core podem ser definidos sem a necessidade de definir variables ​​de ambiente para o usuário ou ter que criar várias inputs de comandos.

  1. Vá para o seu aplicativo no IIS e escolha o Configuration Editor .
  2. Selecione o Configuration Editor
  3. Escolha system.webServer/aspNetCore (RC2 e RTM) ou system.webServer/httpPlatform (RC1) na Section combobox
  4. Escolha Applicationhost.config ... em From combobox.
  5. Clique no elemento enviromentVariables e abra a janela de edição.
  6. Defina suas variables ​​de ambiente.
  7. Feche a janela e clique em Aplicar.
  8. Feito

Dessa forma, você não precisa criar usuários especiais para seu pool ou criar inputs de comandos extras em project.json . Além disso, adicionar comandos especiais para cada ambiente quebra “construir uma vez, implantar muitas vezes”, pois você terá que chamar dnu publish separadamente para cada ambiente, em vez de publicar uma vez e implementar o artefato resultante várias vezes.

Atualizado para RC2 e RTM, graças a Mark G e tredder.

Atualizado para RTM e RC2

Atualize o web.config com uma seção em

          

Ou para evitar perder essa configuração ao sobrescrever o web.config, faça alterações semelhantes em applicationHost.config especificando o local do site conforme sugere o @NickAb.

                   

Editar: a partir dos lançamentos RC2 e RTM, este aviso está desatualizado. A melhor maneira que encontrei para realizar isso na versão é editar as seguintes seções web.config no IIS para cada ambiente:

system.webServer/aspNetCore :

Edite a input environmentVariable e inclua uma configuração de variável de ambiente:

ASPNETCORE_ENVIRONMENT : < Your environment name >


Como alternativa à abordagem do drpdrp, você pode fazer o seguinte:

  • Em seu project.json, adicione comandos que passam a variável ASPNET_ENV diretamente para o 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" }

  • Ao publicar, use a opção --iis-command para especificar um ambiente:

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

Eu achei essa abordagem menos intrusiva do que criar usuários extras do IIS.

Após extenso googling eu encontrei uma solução de trabalho, que consiste em duas etapas.

A primeira etapa é definir a variável de ambiente ASPNET_ENV do sistema como Produção e Reiniciar o Windows Server . Depois disso, todos os aplicativos da web estão obtendo o valor “Produção” como EnvironmentName.

A segunda etapa (para habilitar o valor ‘Staging’ para a Web de teste) foi um pouco mais difícil de funcionar corretamente, mas aqui está:

  1. Crie um novo usuário do Windows, por exemplo, StagingPool no servidor.
  2. Para este usuário, crie uma nova variável de usuário ASPNETCORE_ENVIRONMENT com o valor ‘Staging’ (você pode fazer isso efetuando login como este usuário ou através do regedit)
  3. De volta como admin no gerenciador do IIS, localize o Pool de Aplicativos sob o qual a Web de Preparação está sendo executada e, em Configurações Avançadas, defina Identity como StagingPool do usuário.
  4. Também defina Carregar perfil de usuário para verdadeiro , para que as variables ​​de ambiente sejam carregadas. < - muito importante!
  5. Certifique-se de que o StagingPool tenha direitos de access à pasta da web e Pare e inicie o pool de aplicativos.

Agora, a Web de preparação deve ter o EnvironmentName configurado como ‘Staging’.

Atualização: no Windows 7+, há um comando que pode definir variables ​​de ambiente no prompt do CMD também para um usuário especificado. Esta saída ajuda mais amostras:

 >setx /? 

Eu tenho meus aplicativos da web (PRODUÇÃO, STAGING, TEST) hospedados no servidor web do IIS. Portanto, não era possível confiar na variável de ambiente do sistema operativo ASPNETCORE_ENVIRONMENT, porque defini-la como um valor específico (por exemplo, STAGING) tem efeito em outros aplicativos.

Como solução alternativa, defini um arquivo personalizado (envsettings.json) dentro da minha solução visualstudio:

insira a descrição da imagem aqui

com o seguinte conteúdo:

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

Em seguida, com base no tipo de aplicativo (Produção, Armazenamento temporário ou Teste), defino este arquivo de acordo: supondo que eu esteja implantando o aplicativo TEST, terei:

 "ASPNETCORE_ENVIRONMENT": "Test" 

Depois disso, no arquivo Program.cs, apenas recupere este valor e, em seguida, defina o ambiente do 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(); } } 

Lembre-se de include o envsettings.json no publishOptions (project.json):

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

Essa solução me libera para ter o aplicativo ASP.NET CORE hospedado no mesmo IIS, independentemente do valor da variável de ambiente.

Para estender a resposta do @ tredder você pode alterar o ambienteVariables using appcmd

Encenação

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

Produção

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

A solução @stredder com a edição applicationHost.config é a que funciona se você tiver vários aplicativos diferentes localizados em diretórios virtuais no IIS.

Meu caso é:

  • Eu tenho projeto API e projeto APP , sob o mesmo domínio, colocados em diferentes diretórios virtuais
  • A página raiz XXX não parece propagar a variável ASPNETCORE_ENVIRONMENT para seus filhos em diretórios virtuais e …
  • … Eu sou incapaz de definir as variables ​​dentro do diretório virtual como @NickAb descrito (tenho erro A solicitação não é suportada. (Exceção de HRESULT: 0x80070032) durante salvar as alterações no Editor de configuração):
  • Indo para applicationHost.config e criando manualmente nós como este:

e reiniciar o IIS fez o trabalho.

O que você precisa saber em um só lugar:

  • Para variables ​​de ambiente para sobrescrever quaisquer configurações, elas devem ser prefixadas com ASPNETCORE_ .
  • Se você quiser corresponder nós filhos em sua configuração JSON, use : como separador. Se a plataforma não permitir dois pontos nas chaves de variables ​​de ambiente, use __ .
  • Você quer que suas configurações acabem no ApplicationHost.config . O uso do Editor de Configuração do IIS fará com que suas inputs sejam gravadas no Web.config do aplicativo – e serão sobrescritas com a próxima implantação!
  • Para modificar ApplicationHost.config , você deseja usar appcmd.exe para certificar-se de que suas modificações são consistentes. Exemplo: %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

  • Caracteres que não são seguros para URL podem ser escapados como Unicode, como %u007b para a chave esquerda.

  • Para listar suas configurações atuais (combinadas com valores do Web.config): %systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
  • Se você executar o comando para definir uma chave de configuração várias vezes para a mesma chave, ela será adicionada várias vezes! Para remover um valor existente, use algo como %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 .

Para obter os detalhes sobre o erro, eu tive que adicionar a variável de ambiente ASPNETCORE_ENVIRONMENT para o pool de aplicativos correspondente system.applicationHost/applicationPools .

Nota: o aplicativo da web no meu caso era o ASP.NET Core 2 Web ASP.NET Core 2 hospedado no IIS 10 . Isso pode ser feito por meio do Configuration Editor no IIS Manager (consulte Edição de collections com o Editor de configuração para descobrir onde encontrar esse editor no IIS Manager ).

Eu criei um repository para publicar o IIS com a configuração do ambiente no Web.config.

https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment

  • Obtenha as seções dos arquivos .csproj e .user.csproj nos seus arquivos de projeto.
  • Obtenha os arquivos MyAspNetEnvironment.props, web.development.config e web.production.config.
  • Altere o valor da propriedade ASPNETCORE_ENVIRONMENT em user.csproj de forma relevante.

Existe uma ferramenta bem documentada no github para transformações xdt . Também não depende do comando, tanto do dotnet publish quanto do dotnet msbuild funciona bem.

Você precisa criar diferentes arquivos web.config, como web.debug.cofig, web.release.config etc. Com base nisso, você pode facilmente definir sua própria variável de ambiente.