Usando Web.config diferente no ambiente de desenvolvimento e produção

194

Preciso usar uma seqüência de conexão de banco de dados diferente e o endereço do servidor SMTP no meu aplicativo ASP.NET, dependendo da execução no ambiente de desenvolvimento ou produção.

O aplicativo lê as configurações do arquivo Web.config via WebConfigurationManager.AppSettings propriedade .

Uso o comando Build / Publish para implantar o aplicativo no servidor de produção via FTP e, em seguida, substitua manualmente o Web.config remoto pelo correto.

É possível, de alguma forma, simplificar o processo de implantação? Obrigado!

Alexander Prokofyev
fonte

Respostas:

159

No Visual Studio 2010 e superior, agora você pode aplicar uma transformação ao seu web.config, dependendo da configuração da compilação.

Ao criar um web.config, você pode expandir o arquivo no Solution Explorer e verá dois arquivos:

  • Web.Debug.Config
  • Web.Release.Config

Eles contêm código de transformação que pode ser usado para

  • Alterar a cadeia de conexão
  • Remova o rastreio e as configurações de depuração
  • Registrar páginas de erro

Consulte Sintaxe de transformação Web.config para implantação de projetos de aplicativos Web no MSDN para obter mais informações.

Também é possível, embora oficialmente sem suporte, aplicar o mesmo tipo de transformação a um app.configarquivo de aplicativo não da Web . Veja o blog de Phil Bolduc sobre como modificar seu arquivo de projeto para adicionar uma nova tarefa ao msbuild.

Essa é uma solicitação longa e persistente no Visual Studio Uservoice .

Uma extensão para o Visual Studio 2010 e posterior, " SlowCheetah " , está disponível para cuidar da criação de transformação para qualquer arquivo de configuração. A partir do Visual Studio 2017.3, o SlowCheetah foi integrado ao IDE e a base de código está sendo gerenciada pela Microsoft. Esta nova versão também suporta a transformação JSON.

Vigilante Pierre-Alain
fonte
7
Observe que isso não funciona para projetos antigos de sites . Somente para aplicativos da web . Não tentei ver se a solução alternativa de Phil Bolduc funciona em sites, mas suspeito que não, pois eles não têm arquivos de projeto.
mo.
13
Observe também que o web.confg transforma trabalho apenas para PUBLISHING, eles não funcionam se você simplesmente criar / executar F5: (((((
Alex
7
Se o seu web.config não contiver um Web.Debug.Confige Web.Release.Config, pode ser necessário clicar com o botão direito do mouse Web.Confige clicar Add Config Transforms.
Doug S
1
@ Alex: como podemos usá-lo para compilação simples / F5?
Apostador
1
link direto para SlowCheetah: marketplace.visualstudio.com/…
Xiao
83

A <appSettings>tag no web.config suporta um atributo de arquivo que carrega uma configuração externa com seu próprio conjunto de chaves / valores. Eles substituirão as configurações que você tiver no seu web.config ou as adicionarão.

Tiramos vantagem disso modificando nosso web.config no momento da instalação com um atributo de arquivo que corresponde ao ambiente em que o site está sendo instalado. Fazemos isso com um interruptor no nosso instalador.

por exemplo;

<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">

<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">

<appSettings file=".\EnvironmentSpecificConfigurations\production.config">

Nota:

  • Alterações no .config especificado pelo atributo não acionarão uma reinicialização do processo do operador do asp.net
Jason Slocomb
fonte
2
Essa é uma excelente resposta, especialmente quando você tem uma grande quantidade de ambientes e algumas das configurações de alguns ambientes têm senhas e similares que você não deseja acompanhar no controle de origem.
Phil
1
Existe uma maneira dinâmica de alterar o caminho do arquivo? Com base em qual servidor você está? Apenas uma observação: está funcionando em um projeto de site antigo, não em um aplicativo da web. Então obrigado!
Perspectiva
2
Há um atributo restartOnExternalChangesque tratará esses arquivos como se fossem web.configs. Fonte: learnable.com/books/…
David Schwartz
13

Eu também gostaria de saber. Isso ajuda a isolar o problema para mim

<connectionStrings configSource = "connectionStrings.config" />

Eu mantenho um connectionStrings.config e um "{host} connectionStrings.config". Ainda é um problema, mas se você fizer isso para seções diferentes nos dois ambientes, poderá implantar e versão o mesmo web.config.

(E eu não uso VS, btw.)

harpo
fonte
Se você estivesse usando o VS, poderia usar prebuild-events para copiar de um debug.connectionstrings.config ou release.connectionstrings.config como: copy $ (ProjectDir) $ (ConfigurationName) ConnectionStrings.config $ (ProjectDir) ConnectionStrings.config conforme sugerido por Scott. Hanselmann: hanselman.com/blog/…
Thomas
6

Eu uso um Script de Construção NAnt para implantar nos meus diferentes ambientes. Eu tenho que modificar meus arquivos de configuração via XPath, dependendo de onde eles estão sendo implantados, e então os coloca automaticamente nesse ambiente usando o Beyond Compare .

Demora um ou dois minutos para configurar, mas você só precisa fazê-lo uma vez. Em seguida, os arquivos em lote assumem o controle enquanto eu vou pegar outra xícara de café. :)

Aqui está um artigo que eu encontrei.

Jeff Sheldon
fonte
5

Em um projeto em que tínhamos 4 ambientes (desenvolvimento, teste, preparação e produção), desenvolvemos um sistema em que o aplicativo selecionava a configuração apropriada com base no nome da máquina na qual foi implantado.

Isso funcionou para nós porque:

  • os administradores poderiam implantar aplicativos sem envolver desenvolvedores (um requisito) e sem precisar mexer nos arquivos de configuração (que eles odiavam);
  • nomes de máquinas aderiram a uma convenção. Combinamos nomes usando uma expressão regular e implantamos em várias máquinas em um ambiente; e
  • usamos segurança integrada para cadeias de conexão. Isso significa que poderíamos manter nomes de contas em nossos arquivos de configuração em tempo de design sem revelar nenhuma senha.

Funcionou bem para nós nesse caso, mas provavelmente não funcionaria em todos os lugares.

dariom
fonte
3

O editor de configuração da Biblioteca da empresa pode ajudá-lo a fazer isso. Permite criar um arquivo de configuração base e, em seguida, deltas para cada ambiente. Você pode mesclar a configuração base e o delta para criar um web.config específico do ambiente. Dê uma olhada nas informações aqui, que mostram você melhor do que eu.

PhilPursglove
fonte
3

Você também pode torná-lo uma etapa pós-compilação. Configure uma nova configuração que seja "Implantar", além de Depurar e liberar, e depois faça a cópia da etapa pós-compilação no web.config correto.

Usamos compilações automatizadas para todos os nossos projetos e, com elas, o script de compilação atualiza o arquivo web.config para apontar para o local correto. Mas isso não ajudará se você estiver fazendo tudo do VS.

Cory Foy
fonte
3

Esse é um dos grandes benefícios do uso do machine.config. No meu último trabalho, tivemos ambientes de desenvolvimento, teste e produção. Poderíamos usar o machine.config para coisas como cadeias de conexão (para a máquina SQL dev / test / prod apropriada).

Isso pode não ser uma solução para você se você não tiver acesso à máquina de produção real (como se estivesse usando uma empresa de hospedagem em um host compartilhado).

Timothy Khouri
fonte
1

Você também pode usar a extensão "Configuration Transform", que funciona da mesma forma que "SlowCheetah",

Parth Kale
fonte
Sim, ele funciona, mas apenas no deploy, não na compilação. Eu gostaria de poder simplesmente compilar e depurar usando diferentes ambientes de transformação de configuração
Ch'nycos 17/04