Lendo essas duas perguntas / respostas, consegui executar um aplicativo Asp.net 5 no servidor IIS 8.5.
Asp.net vNext beta inicial publicar no IIS no servidor Windows
Como configurar um aplicativo MVC6 para funcionar no IIS?
O problema é que o aplicativo Web ainda está usando env.EnvironmentName
valor, Development
mesmo quando executado no IIS.
Além disso, quero executar duas versões da mesma Web (armazenamento temporário, produção) no mesmo servidor, portanto, preciso de um método para definir a variável para cada Web separadamente.
Como fazer isso?
Properties\launchSettings.json
para simular outro ambiente para depuração no Visual Studio.Respostas:
Esta resposta foi originalmente escrita para o ASP.NET Core RC1. No RC2, o ASP.NET Core passou do manipulador httpPlafrom genérico para o aspnetCore específico. Observe que a etapa 3 depende de qual versão do ASP.NET Core você está usando.
Acontece que variáveis de ambiente para projetos do ASP.NET Core podem ser definidas sem a necessidade de definir variáveis de ambiente para o usuário ou a criação de várias entradas de comandos.
Configuration Editor
.Configuration Editor
system.webServer/aspNetCore
(RC2 e RTM) ousystem.webServer/httpPlatform
(RC1) naSection
caixa de combinaçãoApplicationhost.config ...
naFrom
caixa de combinação.enviromentVariables
elemento, selecione e'environmentVariables' element
, em seguidaEdit Items
.Dessa forma, você não precisa criar usuários especiais para o seu pool ou criar entradas de comandos extras no
project.json
. Além disso, a adição de comandos especiais para cada ambiente interrompe "criar uma vez, implantar várias vezes", pois você precisará chamardnu publish
separadamente para cada ambiente, em vez de publicar uma vez e implantar o artefato resultante várias vezes.Atualizado para RC2 e RTM, graças a Mark G e tredder.
fonte
system.webServer/aspNetCore
lugar.Atualize web.config com uma seção <environmentVariables> em <aspNetCore>
Ou, para evitar perder essa configuração ao substituir o web.config, faça alterações semelhantes ao applicationHost.config especificando o local do site, como sugere o @NickAb.
fonte
Target configuration object '/system.webServer/aspNetCore/environmentVariables/environmentVariable is not found ...
normalmente para definir alguma variável. Eu escreveria algo assim: oSet-WebConfigurationProperty -PSPath IIS:\ -location example.com -filter /system.webServer/aspNetCore/environmentVariables/environmentVariable -name ASPNETCORE_ENVIRONMENT -value Staging
que estou perdendo?appcmd
.Set-WebConfigurationProperty -PSPath IIS:\ -Location example.com -Filter /system.webServer/aspNetCore/environmentVariables -Name . -Value @{ Name = 'ASPNETCORE_ENVIRONMENT'; Value = 'Staging' }
Edit: a partir das versões RC2 e RTM, este conselho está desatualizado. A melhor maneira que encontrei para fazer isso na versão é editar as seguintes seções web.config no IIS para cada ambiente:
system.webServer/aspNetCore
:Edite a entrada environmentVariable e adicione uma configuração de variável de ambiente:
ASPNETCORE_ENVIRONMENT
:< Your environment name >
Como alternativa à abordagem do drpdrp, você pode fazer o seguinte:
No seu project.json, adicione comandos que transmitem a variável ASPNET_ENV diretamente ao Kestrel:
Ao publicar, use a
--iis-command
opção para especificar um ambiente:Achei essa abordagem menos invasiva do que a criação de usuários extras do IIS.
fonte
Eu tenho meus aplicativos Web (PRODUÇÃO, STAGING, TEST) hospedados no servidor Web IIS. Portanto, não foi possível confiar na variável de ambiente do sistema do operador ASPNETCORE_ENVIRONMENT, porque configurá-la para um valor específico (por exemplo, STAGING) afeta outros aplicativos.
Como solução alternativa, defini um arquivo personalizado (envsettings.json) na minha solução do visualstudio:
com o seguinte conteúdo:
Em seguida, com base no meu tipo de aplicativo (produção, teste ou teste), defino este arquivo de acordo: supondo que estou implantando o aplicativo TEST, terei:
Depois disso, no arquivo Program.cs, recupere esse valor e defina o ambiente do webHostBuilder:
Lembre-se de incluir o envsettings.json no publishOptions (project.json):
Essa solução me deixa livre para ter o aplicativo ASP.NET CORE hospedado no mesmo IIS, independentemente do valor da variável do ambiente.
fonte
Depois de pesquisar bastante, encontrei uma solução funcional, que consiste em duas etapas.
A primeira etapa é definir a variável de ambiente ASPNET_ENV para todo o sistema como Produção e reiniciar o Windows Server . Depois disso, todos os aplicativos da Web estão recebendo o valor 'Production' como EnvironmentName.
A segunda etapa (para habilitar o valor 'Preparação' para a Web de preparação) foi bastante mais difícil de funcionar corretamente, mas aqui está:
Agora, a Web de armazenamento temporário deve ter o Nome do ambiente definido como 'Armazenamento temporário'.
Atualização: no Windows 7 ou superior, existe um comando que pode definir variáveis de ambiente no prompt do CMD também para um usuário especificado. Isso gera mais exemplos de ajuda:
fonte
Como alternativa, você pode passar o desejado
ASPNETCORE_ENVIRONMENT
para o comando dotnet publish como um argumento usando:por exemplo:
Isso gerará o web.config com o ambiente correto especificado para o seu projeto:
fonte
Além das opções mencionadas acima, existem algumas outras soluções que funcionam bem com implantações automatizadas ou exigem menos alterações na configuração.
1. Modificando o arquivo de projeto (.CsProj)
O MSBuild suporta a
EnvironmentName
propriedade, que pode ajudar a definir a variável de ambiente correta conforme o ambiente que você deseja implantar. O nome do ambiente seria adicionado no web.config durante a fase de publicação.Simplesmente abra o arquivo do projeto (* .csProj) e adicione o seguinte XML.
O código acima adicionaria o nome do ambiente da
Development
configuração de depuração ou se nenhuma configuração for especificada. Para qualquer outra configuração, o nome do ambiente estariaProduction
no arquivo web.config gerado. Mais detalhes aqui2. Adicionando a propriedade EnvironmentName nos perfis de publicação.
Também podemos adicionar a
<EnvironmentName>
propriedade no perfil de publicação. Abra o arquivo de perfil de publicação localizado emProperties/PublishProfiles/{profilename.pubxml}
Isso definirá o nome do ambiente em web.config quando o projeto for publicado. Mais detalhes aqui3. Opções de linha de comando usando a publicação dotnet
Além disso, podemos passar a propriedade
EnvironmentName
como uma opção de linha de comando para odotnet publish
comando. O comando a seguir incluiria a variável de ambiente comoDevelopment
no arquivo web.config.dotnet publish -c Debug -r win-x64 /p:EnvironmentName=Development
fonte
Para estender a resposta do @ tredder, você pode alterar o environmentVariables usando
appcmd
Estadiamento
%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
fonte
O que você precisa saber em um só lugar:
ASPNETCORE_
.:
como separador. Se a plataforma não permitir dois pontos nas chaves de variável de ambiente, use-a__
.ApplicationHost.config
. O uso do Editor de configuração do IIS fará com que suas entradas sejam gravadas no aplicativoWeb.config
- e serão substituídas na próxima implantação!Para modificar
ApplicationHost.config
, você deseja usarappcmd.exe
para garantir que suas modificações sejam 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
Os caracteres que não são seguros para URL podem ser escapados como Unicode, como
%u007b
no colchete esquerdo.%systemroot%\system32\inetsrv\appcmd.exe list config "Default Web Site/MyVirtualDir" -section:system.webServer/aspNetCore
%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
.fonte
/commit:site
as alterações são gravadas no web.config, a fim de salvá-los noApplicationHost.config
deve-se usar/commit:apphost
-section:system.webServer/aspNetCore /-"environmentVariables.
(com menos para remover a variável de ambiente) falha ao ser executada durante o pipeline de lançamento do Azure. O erro éhresult:80070032, message:Command execution failed
. No entanto,clear config "Default Web Site/$(webSiteName)" -section:system.webServer/aspNetCore /commit:site
funciona bem. Ele limpa toda a seção aspNetCore do site, mas não é um problema, pois é parametrizado durante o lançamento.Semelhante a outras respostas, eu queria garantir que minha configuração de ambiente do ASP.NET Core 2.1 persistisse nas implantações, mas também se aplicasse apenas ao site específico.
De acordo com a documentação da Microsoft, é possível definir a variável de ambiente no pool de aplicativos usando o seguinte comando do PowerShell no IIS 10:
Infelizmente ainda tenho que usar o IIS 8.5 e pensei que estava sem sorte. No entanto, ainda é possível executar um script simples do PowerShell para definir um valor de variável de ambiente específico do site para ASPNETCORE_ENVIRONMENT:
fonte
A solução @tredder com edição applicationHost.config é a que funciona se você tiver vários aplicativos diferentes localizados em diretórios virtuais no IIS.
Meu caso é:
Indo para applicationHost.config e criando nós manualmente como este:
<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 reiniciar o IIS fez o trabalho.
fonte
Para obter os detalhes sobre o erro, tive que adicionar
ASPNETCORE_ENVIRONMENT
uma variável de ambiente ao pool de aplicativos correspondentesystem.applicationHost/applicationPools
.Nota: o aplicativo Web, no meu caso, era
ASP.NET Core 2
um aplicativo Web hospedado emIIS 10
. Isso pode ser feito viaConfiguration Editor
inIIS Manager
(consulte Editando coleções com o Editor de configuração para descobrir onde encontrar esse editorIIS Manager
).fonte
Eu criei um repositório para publicar o IIS com a configuração do ambiente no Web.config.
https://github.com/expressiveco/AspnetCoreWebConfigForEnvironment
fonte
Modifiquei a resposta que é dada por @Christian Del Bianco . Alterei o processo para .net core 2 e superior como arquivo project.json agora absoluto.
Primeiro, crie o arquivo appsettings.json no diretório raiz. com o conteúdo
Em seguida, crie outro arquivo de configuração appsettings.Development.json e appsettings.Production.json com a configuração necessária.
Adicione o código necessário para configurar o ambiente no arquivo Program.cs .
}
Adicione o envsettings.json ao seu .csproj arquivo para copiar para o diretório publicado.
Agora basta alterar o ASPNETCORE_ENVIRONMENT conforme desejado no arquivo envsettings.json e publicado.
fonte