Altere um web.config programaticamente com C # (.NET)

93

Como posso modificar / manipular o web.configprogramaticamente com C #? Posso usar um objeto de configuração e, em caso afirmativo, como carregá-lo web.configem um objeto de configuração? Eu gostaria de ter um exemplo completo alterando a string de conexão. Após a modificação, o web.configdeve ser gravado de volta no disco rígido.

Kottan
fonte
Verifique sua postagem no blog sobre como manipular programaticamente web.config no ASP.NET 2.0 e ASP.NET 3.5. Alternativamente, verifique esta pergunta que tem a resposta para sua pergunta. Como defino uma configuração de string de conexão programaticamente em .net?
Shoban

Respostas:

115

Aqui está um código:

var configuration = WebConfigurationManager.OpenWebConfiguration("~");
var section = (ConnectionStringsSection)configuration.GetSection("connectionStrings");
section.ConnectionStrings["MyConnectionString"].ConnectionString = "Data Source=...";
configuration.Save();

Veja mais exemplos neste artigo , talvez você precise dar uma olhada na falsificação de identidade .

Alex LE
fonte
Qual é o nome da string de conexão no arquivo web.config?
Alex LE
o link para o artigo está quebrado
Vitall
@AlexLE: Como especificamos o local do arquivo quando web.config é colocado em um local diferente. Pode ser um servidor remoto em um caminho compartilhado?
SharpCoder
@SharpCoder, o caminho é um caminho virtual, então você precisa primeiro copiar o web.config do servidor remoto para seu aplicativo local (dentro de uma pasta temporária para não substituir seu próprio web.config), edite-o, salve e copie de volta para o servidor remoto. Ou uma solução melhor e mais complexa seria: criar uma API que faça o trabalho (altere o web.config), implante-a no servidor remoto e depois consuma-a do servidor local.
Guilherme Branco Stracini 10/10/2016
@Skami você deve definir o nome de connectionStrings como "MyConnectionString", o que significa section.ConnectionStrings ["MyConnectionString"], o valor deve corresponder ao nome.
Liakat
12
Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
ConnectionStringsSection section = config.GetSection("connectionStrings") as ConnectionStringsSection;
//section.SectionInformation.UnprotectSection();
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
config.Save();
ASergan
fonte
Como obter o ID do usuário da variável de seção?
Niks de
5

Como o arquivo web.config é um arquivo xml, você pode abrir o web.config usando a classe xmldocument. Obtenha o nó do arquivo xml que deseja atualizar e salve o arquivo xml.

aqui está o URL que explica com mais detalhes como você pode atualizar o arquivo web.config programaticamente.

http://patelshailesh.com/index.php/update-web-config-programmatically

Observação: se você fizer qualquer alteração no web.config, o ASP.NET detecta essas alterações e recarrega seu aplicativo (reciclar pool de aplicativos) e o efeito disso é que os dados mantidos na sessão, aplicativo e cache serão perdidos (assumindo o estado da sessão é InProc e não está usando um servidor de estado ou banco de dados).

Shailesh
fonte
Sei que é tecnicamente possível, acho que o método sancionado / aprovado pela Microsoft provavelmente será mais duradouro e menos sujeito a quebrar o web.config. Todos nós atualizamos esses arquivos "manualmente", mas acho que é arriscado com servidores web de produção. Apenas meu 2c.
Anthony Horne
2

Este é um método que eu uso para atualizar AppSettings, funciona tanto para aplicações web quanto para desktop. Se você precisar editar connectionStrings, poderá obter esse valor de System.Configuration.ConnectionStringSettings config = configFile.ConnectionStrings.ConnectionStrings["YourConnectionStringName"];e definir um novo valor com config.ConnectionString = "your connection string";. Observe que se você tiver quaisquer comentários na connectionStringsseção, Web.Configestes serão removidos.

private void UpdateAppSettings(string key, string value)
{
    System.Configuration.Configuration configFile = null;
    if (System.Web.HttpContext.Current != null)
    {
        configFile =
            System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
    }
    else
    {
        configFile =
            ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    }
    var settings = configFile.AppSettings.Settings;
    if (settings[key] == null)
    {
        settings.Add(key, value);
    }
    else
    {
        settings[key].Value = value;
    }
    configFile.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
}
Ogglas
fonte
Este código é bom e eu votei a favor, mas não funcionará se appSettings estiver definido em outro arquivo, como por exemplo: <appSettings file = "C: \ Client \ customSettings.config"> </appSettings>
Ben Junior