Você está na página 1de 19

Usando Arquivos de Configurao

9 de 10 pessoas classificaram isso como til


Juliano Ace
Janeiro 2011
Tecnologias: Visual Studio 2010, .NET Framework 4

Sumrio: Apresentarei nesse artigo os benefcios dos arquivos de configurao e como ler e escrever informaes neles.
Baixe o cdigo fonte
Contedo
Introduo
Formato dos Arquivos de Configurao
Tipos de Arquivos de Configurao
Adicionando Arquivo de Configurao
Lendo Informaes do Arquivo de Configurao
Escrevendo Informaes no Arquivo de Condigurao
Arquivos de Configurao em Aplicaes ASP.NET
Criptografia
Concluso
Referncias + Tpicos Relacionados
Sobre o Autor
Introduo
Arquivos de Configurao so arquivos onde podemos guardar informaes que podem ser facilmente alteradas sem a necessidade de recompilao de nossa
aplicao, ou seja, basta alterarmos esse arquivo e reiniciar a aplicao que as alteraes sero aplicadas. Esse arquivo um arquivo Extensible Markup Language
(XML) e pode ser alterado no famoso Bloco de Notas do Windows. Vou tambm fazer uma breve introduo de como criptografar e decriptografar sees nos
arquivos de configurao.
Formato dos Arquivos de Configurao
Os arquivos de configurao contm elementos. Elementos so estruturas onde definimos as configuraes como por exemplo o elemento onde definimos a
connection string, <connectionStrings>. O cdigo </connectionStrings> indica o final do elemento.
As configuraes so definidas dentro dos elementos, essas configuraes so definidas atravs de atributos pr-definidos (chave/valor). Abaixo (listagem 1) um
exemplo do elemento connectionStrings:

Listagem 1 Elemento connectionStrings
Como podemos ver no exemplo acima, temos um elemento add dentro do elemento connectionStrings e vrios atributos (name e providerName) com chave e
valor configurando a string de conexo com o banco de dados.
Tipos de Arquivos de Configurao
Existem trs tipos de arquivos de configurao:
Arquivos de configurao de mquina.
Arquivos de configurao de aplicao.
Arquivos de configurao de segurana.
Arquivos de Configurao de Mquina
O arquivo de configurao de mquina (Machine.config) contm configuraes a nvel de mquina, ou seja, configuraes que se aplicam em toda a mquina. Ele
pode ser encontrado na pasta Config do diretrio de instalao do .NET Framework.
<connectionStrings>
<add name="MinhaStringDeConexao"
connectionString="Data Source=(local); Initial Catalog=MinhaDb; Integrated Security=SSPI;"
providerName="SqlClient"/>
</connectionStrings>
Arquivos de Configurao de Aplicao
O arquivo de configurao de aplicao contm configuraes para uma aplicao especfica.
Se a aplicao for uma aplicao Windows, o arquivo de configurao fica no mesmo diretrio da aplicao. O nome do arquivo de configurao o nome da
aplicao mais a extenso .config, ou seja, se temos uma aplicao chamada MinhaAplicacao.exe o arquivo de configurao se chamar MinhaAplicacao.exe.config.
Se a aplicao for uma aplicao ASP.NET, o arquivo de configurao se chamar Web.config.
Arquivos de Configurao de Segurana
O arquivo de configurao de segurana contm configuraes de hierarquia de grupos e permisses associadas aos nveis de poltica de segurana.
extremamente recomendado que se use a ferramenta .NET Framework Configuration e/ou a ferramenta Code Access Security Policy para modificar essas
configuraes para assegurar que as mudanas no corrompa o arquivo de configurao.
Adicionando Arquivo de Configurao
Quando criamos uma aplicao do tipo Windows Forms, Windows Presentation Foundation ou Console Application por padro no temos um arquivo de
configurao em nosso projeto. Para adicionar basta clicarmos com o boto direito do mouse em cima do projeto na janela Solution Explorer, selecionar a opo
Add, New Item...
Na janela Add New Item selecionamos o arquivo Application Configuration File, conforme figura 1:
Figura 1 Adicionando Application Configuration File ao Projeto
Aps adicionarmos o arquivo de configurao, ele aberto no code editor do Visual Studio para que possamos configur-lo. Na primeira linha temos a verso do
XML (1.0) e o encoding usado (utf-8).
Na linha 2 temos um elemento configuration, dentro dele que adicionamos os elementos necessrios para configurao de nossa aplicao.
Como no exemplo acima, vamos definir a connection string para a nossa base de dados, veja listagem 2 abaixo:
Listagem 2 App.config
Lendo Informaes do Arquivo de Configurao
Agora voltando a aplicao (nesse caso criei uma aplicao console chamada MinhaAplicacao), vamos ler as informaes (connectionStrings) contidas no arquivo de
configurao. Para fazermos a leitura dessas informaes primeiro precisamos adicionar referncia ao namespaceSystem.configuration. Na imagem 2 abaixo
mostro a referncia:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="MinhaStringDeConexao"
connectionString="Data Source=(local); Initial Catalog=MinhaDb; Integrated Security=SSPI;"/>
</connectionStrings>
</configuration>
Figura 2 Referncia ao namespace System.configuration
Depois disso adicionamos a referncia (using) nossa classe Program.cs conforme listagem 3:
Listagem 3 Referenciando o Namespace
A classe que usamos para ler as informaes a ConfigurationManager. A propriedade que utilizamos para capturar a connection string ConnectionStrings que
retorna uma coleo de connectionStrings do arquivo de configurao. Lembrando que podemos ter vrias connections strings no elemento <connectionStrings> no
mesmo arquivo de configurao. Para pegarmos uma determinada connection string informamos o ndice ou o nome da mesma, a listagem 4 demonstra esse
cdigo:
using System.Configuration
string connectionString =
ConfigurationManager.ConnectionStrings["MinhaStringDeConexao"].ConnectionString;
Listagem 4 Lendo a connection string
O interessante tambm que podemos adicionar nossas prprias configuraes usando chave/valor para defin-las. Para isso, basta adicionarmos um elemento
<appSettings> e dentro dele adicionamos nossos elementos atravs da chave (key) e valor (value), veja a listagem 5:
Listagem 5 Elemento appSettings
Para lermos essa informao tambm usamos a classe ConfigurationManager, s que agora ao invs de usarmos a propriedade ConnectionStrings usamos a
propriedade AppSettings informando o nome da chave, conforme listagem 6 abaixo:
Listagem 6 Lendo configurao customizada
Na figura 3 mostro o resultado:
<appSettings>
<add key="EnviarEmailDeErro" value="true"/>
</appSettings>
bool enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
if (enviarEmail)
{
Console.WriteLine("Enviar email");
}
Figura 3 Mostrando configurao customizada
Escrevendo Informaes no Arquivo de Configurao
Para escrevermos informaes nos arquivos de configurao usamos a classe Configuration.
Primeiro abrimos o arquivo de configurao da aplicao atravs do mtodo OpenExeConfiguration da classe ConfigurationManager e atribuimos instncia da
classe Configuration. Em seguida determinamos o novo valor da configurao atravs da propriedade Value e por fim chamamos o mtodo Save. Podemos ver
todo esse cdigo na listagem 7:
bool enviarEmail;
enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
Console.WriteLine("Enviar email = {0}", enviarEmail.ToString());
Listagem 7 Alterando informaes no arquivo de configurao
O mtodo Save da classe Configuration tem um overload que recebe como parmetro uma das opes do enumerador ConfigurationSaveMode, so elas:
Modified Salva apenas as propriedades modificadas mesmo que o valor seja o mesmo contido no arquivo de configurao.
Minimal Salva apenas as propriedades modificadas desde que os valores sejam diferentes dos valores contidos no arquivo de configurao.
Full Salva todas as propriedades.
Se verificarmos o resultado (figura 4) podemos ver que no o esperado:
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["EnviarEmailDeErro"].Value = "false";
config.Save(ConfigurationSaveMode.Modified);
Console.WriteLine("\nConfigurao EnviarEmailDeErro alterado para 'false'.\n");
enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
Console.WriteLine("Enviar email = {0}", enviarEmail.ToString());
Figura 4 Resultado
O valor ainda est como true. Ainda est assim porque como disse acima a aplicao precisa ser reiniciada. Se fecharmos e executarmos a aplicao novamente
veremos que a propriedade agora estar como false. Veja o resultado na figura 5:
Figura 5 Resultado com a aplicao reiniciada
Para evitarmos que a aplicao seja reiniciada para que a alterao seja aplicada podemos chamar o mtodo RefreshSection da classe ConfigurationManager
passando o nome da seo que queremos atualizar, no nosso caso a sesso appSettings. Abaixo, na listagem 8, podemos ver como ficar o cdigo e na figura 6
podemos ver o resultado:
bool enviarEmail;
enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
Console.WriteLine("Enviar email = {0}", enviarEmail.ToString());
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["EnviarEmailDeErro"].Value = "false";
config.Save(ConfigurationSaveMode.Modified);
Listagem 8 Usando o mtodo RefreshSection
Console.WriteLine("\nConfigurao EnviarEmailDeErro alterado para 'false'.\n");
enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
Console.WriteLine("Enviar email = {0}\n", enviarEmail.ToString());
ConfigurationManager.RefreshSection("appSettings");
Console.WriteLine("Seo appSettings atualizada.\n");
enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
Console.WriteLine("Enviar email = {0}\n", enviarEmail.ToString());
Figura 6 Resultado com o mtodo RefreshSection
Para adicionarmos uma nova configurao basta usarmos o mtodo Add da propriedade Settings conforme a listagem 9:
Listagem 9 Adicionando informaes no arquivo de configurao
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Add("Quantidade", "12");
config.Save();
int quantidade =
Convert.ToInt32(config.AppSettings.Settings["Quantidade"].Value);
Observao: Quando alteramos ou adicionamos algo no arquivo de configurao atravs de cdigo, o arquivo app.config atualizado o que est na pasta da
aplicao, no nosso caso, na pasta Debug do projeto e no aquele que criamos no Visual Studio.
Se selecionarmos a opo Rebuild Solution no Visual Studio o arquivo de configurao atualizado ser sobrescrito pelo antigo que est na soluo do projeto.
Arquivos de Configurao em Aplicaes ASP.NET
As alteraes feitas nos arquivos de configurao de aplicaes ASP.NET assim como aplicaes Windows precisam ser reiniciadas para que sejam aplicadas, mas
diferentemente de aplicaes Windows, ao alterar qualquer informao no arquivo de configurao de uma aplicao ASP.NET a aplicao reiniciada
automaticamente acarretando na perda de todos os dados em memria.
Podemos ter vrios arquivos de configurao em uma aplicao ASP.NET, um cenrio onde utilizamos essa tcnica quando precisamos definir permisses em
diretrios especficos.
Por exemplo, podemos ter um arquivo Web.config na raiz da aplicao contendo uma connection string e um arquivo Web.config em uma pasta que restrita a
usurios que pertencem a roleAdministrador. A imagem 6 nos mostra uma aplicao ASP.NET na jalena Solution Explorer com dois arquivos Web.config:
Figura 7 Projeto ASP.NET com vria arquivos de configurao
Abaixo, temos a listagem 10 demonstrando o cdigo do arquivo Web.config nvel de aplicao e mais abaixo, na listagem 11, temos o cdigo do arquivo
Web.config nivel de diretrio (AreaRestrita):
Listagem 10 Web.config nvel de aplicao
Listagem 11 Web.config nvel de diretrio
Criptografia
Nada impede de colocarmos dados confidenciais em arquivos de configurao como por exemplo login e senha do banco de dados. Para que no tenhamos
problemas podemos criptografar uma determinada seo do arquivo de configurao. Para isso usamos os mtodos ProtectSection e UnprotectSection da classe
ConfigurationSection para criptografar e decriptografar, respectivamente.
Podemos configurar provedores de segurana adicionando-os no arquivo de configurao machine.config. Podemos tambm criar nossos prprios provedores de
segurana criando uma classe herdando da classe ProtectedConfigurationProvider. O .NET Framework fornece dois provedores:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<connectionStrings>
<add name="MinhaStringDeConexao"
connectionString="Data Source=(local); Initial Catalog=MinhaDb; Integrated Security=SSPI;"/>
</connectionStrings>
</configuration>
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<deny users="*"/>
<allow roles="Administrador"/>
</authorization>
</system.web>
</configuration>
RSAProtectedConfigurationProvider.
DPAPIPProtectedConfigurationProvider.
Vamos criar dois mtodos, um chamado Criptografar e outro Decriptografar:
Listagem 12 Mtodo Criptografar
static void Criptografar()
{
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigurationSection section =
config.ConnectionStrings;
if (!section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider");
section.SectionInformation.ForceSave = true;
config.Save();
}
}
static void Decriptografar()
{
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConnectionStringsSection section =
config.ConnectionStrings;
if (section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
Listagem 13 Mtodo Decriptografar
Se verificarmos nosso arquivo de configurao veremos que a seo connectionsStrings agora est criptografada. Abaixo, na listagem 14 temos o arquivo de
configurao sem criptografia e, na listagem 15, o arquivo de configurao criptografado:
Listagem 14 Arquivo de Configurao sem criptografia
section.SectionInformation.ForceSave = true;
config.Save();
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="MinhaStringDeConexao" connectionString="Data Source=(local); Initial Catalog=MinhaDb; Integrated Security=SSPI;" />
</connectionStrings>
<appSettings>
<add key="EnviarEmailDeErro" value="true"/>
</appSettings>
</configuration>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
Listagem 15 Arquivo de Configurao com criptografia
Podemos ainda, nos arquivos de configurao de aplicaes ASP.NET criptografar a partir da ferramenta ASP.NET IIS Registration Tool (Aspnet_regiis.exe). Para
criptografar a seo connectionStrings usamos o seguinte cdigo no Visual Studio Command Prompt: aspnet_regiis -pe "connectionStrings" -app
"/SampleApplication" -prov "RsaProtectedConfigurationProvider" e para decriptografar usamos: aspnet_regiis -pd "connectionStrings" -app
"/SampleApplication".
Observaes: Como disse na introduo desse artigo, isso apenas uma breve introduo criptografia, para maiores detalhes visite o site
http://msdn.microsoft.com/en-us/library/hh8x3tas.aspx.
Concluso
Podemos ver atravs desse artigo que os arquivos de configurao so muito teis para nossas aplicaes. Podemos ler e escrever informaes atravs das classes
que pertencem ao namespace System.configuration. Vimos tambm que necessrio cuidado ao alterar essas informaes em aplicaes ASP.NET pois todos os
dados em memria so perdidos. Fiz tambm uma breve introduo de como criptografar sees que contenham dados confidenciais como login e senha do
banco de dados.
Referncias + Tpicos Relacionados
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>TLw0Y9g1W7+AK7hWglKv2uaJAdP5s3GjsKfTFcaT4HoUG/Gac03ZCRvTJvA35mgJjcaURe8qH2cDFzC/8+kzlTEZvjFERiV4SNBpJQTOsmLBQX3i8cqObmgp3PwBhhYqOH6f7HX9YzFIMUoxflKmb9ighZ9nVfgrjC667hNsplI=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>s9oRXbGsdb7fqPXqnSNzLYqlTGQdY6vaBeF/Hr4azYKeGTrSk8u3DRSpYTHZm1vJfdNJIdkf3S7gIllpoObKLeH96BDde8JBhTMidgQ2nBeSg3ohgxpNqizEyS+eztWo3BSTNEY+CISgvLsJh10mJP5UHLsPqTwNUtIkMPeks5jyFC+fpIMCeo9Gem8LxFMmcmR7qYqNkFge+4oMEv+Ycv8nYhz9PFXUgvypq/1eWXQQBGKsYPTOTQ==</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
<appSettings>
<add key="EnviarEmailDeErro" value="true"/>
</appSettings>
</configuration>
Configuration Files: http://msdn.microsoft.com/en-us/library/1xtk877y(v=VS.100).aspx
Classe Configuration: http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx
Classe ConfigurationManager: http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx
Ferramenta .NET Framework Configuration: http://msdn.microsoft.com/en-us/library/2bc0cxhc.aspx
Ferramenta Code Access Security: http://msdn.microsoft.com/en-us/library/cb6t8dtz.aspx
Encrypting and Decrypting Configuration Sections: http://msdn.microsoft.com/en-us/library/zhhddkxy.aspx
Sobre o Autor
Juliano Ace, entusiasta por tecnologias Microsoft, desenvolvedor de aplicaes .NET h mais de dois anos. Atualmente trabalha em uma empresa do ramo da
sade e escreve artigos regularmente em seu blog (http://julianoaece.wordpress.com).
Pode ser contatado atravs do email julianoaece@yahoo.com.br.
2014 Microsoft

Você também pode gostar