http://www.mxstudio.com.br/wp-content/uploads/2012/05/netframework4.jpg
Usando Arquivos de Configuração, trabalhando com Visual Studio 2010 e .NET Framework 4
Neste artigo veremos os benefícios dos arquivos de configuração e como ler e escrever informações neles. .NET Framework versão 4. O .NET Framework é um componente integral do Windows que oferece suporte à criação e execução da próxima geração de aplicativos e serviços Web. Os principais componentes do .NET Framework são o Common Language Runtime (CLR) e a biblioteca de classes do .NET Framework, que inclui ADO.NET, ASP.NET, Windows Forms e Windows Presentation Foundation (WPF). O .NET Framework fornece um ambiente gerenciado de execução, desenvolvimento e implantação simplificados, além da integração com diversas linguagens de programação. Em Versões anteriores do .NET Framework não fornecida nenhuma maneira para determinar se um domínio de aplicativo em particular irá afetar outros domínios de aplicativo , porque as APIs do sistema operacional e as ferramentas, como o Gerenciador de tarefas do Windows, eram precisas apenas para o nível de processo . Começando com o .NET Framework 4, você pode obter o uso do processador e o uso da memória estima por domínio de aplicativo .
Você pode monitorar a memória e CPU ouso dos domínios de aplicativo. Monitoração de recurso do domínio de aplicativo está disponível através do gerenciado e hospedagem nativa APIs e rastreamento de evento para Windows (ETW). Quando esse recurso foi ativado, ele coleta estatísticas sobre todos os domínios de aplicativo no processo para a vida do processo.
O .NET Framework é o modelo de programação abrangente e consistente da Microsoft para a criação de aplicativos que proporcionam experiências visuais fantásticas para o usuário, uma comunicação direta e segura, além da capacidade de modelar uma grande variedade de processos empresariais.
O .NET Framework 4 trabalha lado a lado com versões mais antigas do Framework. Os aplicativos baseados em versões anteriores do Framework continuarão a ser executados por padrão na versão pretendida.
O .NET Framework 4 inclui os seguintes novos recursos e aprimoramentos:
Baixe e instale o pacote redistribuível do .NET Framework 4 aqui.
Veremos que os arquivos de configuração são muito úteis para nossas aplicações. Podemos ler e escrever informações através das classes que pertencem ao namespace System.configuration. Também que será necessário cuidado ao alterar essas informações em aplicações ASP.NET pois todos os dados em memória são perdidos. E uma breve introdução de como criptografar seções que contenham dados confidenciais como login e senha do banco de dados.
O que é Arquivos de Configuração - Arquivos de Configuração são arquivos onde podemos guardar informações que podem ser facilmente alteradas sem a necessidade de recompilação de nossa aplicação, ou seja, basta alterarmos esse arquivo e reiniciar a aplicação que as alterações serão aplicadas. Esse arquivo é um arquivo Extensible Markup Language (XML) e pode ser alterado no famoso Bloco de Notas do Windows. Vou também fazer uma breve introdução de como criptografar e decriptografar seções nos arquivos de configuração.
Formato dos Arquivos de Configuração
Os arquivos de configuração contém elementos. Elementos são estruturas onde definimos as configurações como por exemplo o elemento onde definimos a connection string, <connectionStrings>. O código </connectionStrings> indica o final do elemento.
As configurações são definidas dentro dos elementos, e são definidas através de atributos pré-definidos (chave/valor). Abaixo no (exemplo 1) um exemplo do elemento connectionStrings:
<connectionStrings>
<add name=”MinhaStringDeConexao”
connectionString=”Data Source=(local); Initial Catalog=Meubd; Integrated Security=SSPI;”
providerName=”SqlClient”/>
</connectionStrings>
Exemplo 1 – Elemento connectionStrings
Como podemos ver no exemplo acima, temos um elemento add dentro do elemento connectionStrings e vários atributos (name e providerName) com chave e valor configurando a string de conexão com o banco de dados.
Tipos de Arquivos de Configuração
Existem três tipos de arquivos de configuração:
Arquivos de Configuração de Máquina
O arquivo de configuração de máquina (Machine.config) contém configurações a nível de máquina, ou seja, configurações que se aplicam em toda a máquina. Ele pode ser encontrado na pasta Config do diretório de instalação do .NET Framework.
Arquivos de Configuração de Aplicação
O arquivo de configuração de aplicação contém configurações para uma aplicação específica.
Se a aplicação for uma aplicação Windows, o arquivo de configuração fica no mesmo diretório da aplicação. O nome do arquivo de configuração é o nome da aplicação mais a extensão .config, ou seja, se temos uma aplicação chamada Aplicacao1.exe o arquivo de configuração se chamará Aplicacao1.exe.config. Se a aplicação for uma aplicação ASP.NET, o arquivo de configuração se chamará Web.config.
Arquivos de Configuração de Segurança
O arquivo de configuração de segurança contém configurações de hierarquia de grupos e permissões associadas aos níveis de política de segurança. É extremamente recomendado que se use a ferramenta .NET Framework Configuration e/ou a ferramenta Code Access Security Policy para modificar essas configurações para assegurar que as mudanças não corrompa o arquivo de configuração.
Como adicionar um Arquivo de Configuração
Quando criamos uma aplicação do tipo Windows Forms, Windows Presentation Foundation ou Console Application por padrão não temos um arquivo de configuração em nosso projeto. Para adicionar basta clicarmos com o botão direito do mouse em cima do projeto na janela Solution Explorer, selecionar a opção 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
Após adicionarmos o arquivo de configuração, ele é aberto no code editor do Visual Studio para que possamos configurá-lo. Na primeira linha temos a versão do XML (1.0) e o encoding usado (utf-8). Na linha 2 temos um elemento configuration, é dentro dele que adicionamos os elementos necessários para configuração de nossa aplicação. bComo no exemplo acima, vamos definir a connection string para a nossa base de dados, veja exemplo 2 abaixo:
<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<connectionStrings>
<add name=”MinhaStringDeConexao”
connectionString=”Data Source=(local); Initial Catalog=Meubd; Integrated Security=SSPI;”/>
</connectionStrings>
</configuration>
Exemplo 2 – App.config
Arquivo de Configuração lendo suas Informações
Agora voltando a aplicação (nesse caso criei uma aplicação console chamada Aplicacao1), vamos ler as informações (connectionStrings) contidas no arquivo de configuração. Para fazermos a leitura dessas informações primeiro precisamos adicionar referência ao namespace System.configuration. Na imagem 2 abaixo mostro a referência:
Figura 2 – Referência ao namespace System.configuration
Depois disso adicionamos a referência (using) à nossa classe Program.cs conforme exemplo 3:
using System.Configuration
Exemplo 3 – Referenciando o Namespace
A classe que usamos para ler as informações é a ConfigurationManager. A propriedade que utilizamos para capturar a connection string é ConnectionStrings que retorna uma coleção de connectionStrings do arquivo de configuração. Lembrando que podemos ter várias connections strings no elemento <connectionStrings> no mesmo arquivo de configuração. Para pegarmos uma determinada connection string informamos o índice ou o nome da mesma, a exemplo 4 demonstra esse código:
string connectionString =
ConfigurationManager.ConnectionStrings["MinhaStringDeConexao"].ConnectionString;
Exemplo 4 – Lendo a connection string
O interessante também é que podemos adicionar nossas próprias configurações usando chave/valor para definí-las. Para isso, basta adicionarmos um elemento <appSettings> e dentro dele adicionamos nossos elementos através da chave (key) e valor (value), veja a exemplo 5:
<appSettings>
<add key=”EnviarEmailDeErro” value=”true”/>
</appSettings>
Exemplo 5 – Elemento appSettings
Para lermos essa informação também usamos a classe ConfigurationManager, só que agora ao invés de usarmos a propriedade ConnectionStrings usamos a propriedade AppSettings informando o nome da chave, conforme exemplo 6 abaixo:
bool enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
if (enviarEmail)
{
Console.WriteLine(“Enviar email”);
}
Exemplo 6 – Lendo configuração customizada
Na figura 3 mostro o resultado:
Figura 3 – Mostrando configuração customizada
Arquivo de Configuração como escrever informações
Para escrevermos informações nos arquivos de configuração usamos a classe Configuration.
Primeiro abrimos o arquivo de configuração da aplicação através do método OpenExeConfiguration da classe ConfigurationManager e atribuimos à instância da classe Configuration. Em seguida determinamos o novo valor da configuração através da propriedade Value e por fim chamamos o método Save. Podemos ver todo esse código na exemplo 7:
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);
Console.WriteLine(“\nConfiguração EnviarEmailDeErro alterado para ‘false’.\n”);
enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
Console.WriteLine(“Enviar email = {0}”, enviarEmail.ToString());
Exemplo 7 – arquivo de configuração informações alteradas
O método Save da classe Configuration tem um overload que recebe como parâmetro uma das opções do enumerador ConfigurationSaveMode, são elas:
Se verificarmos o resultado (figura 4) podemos ver que não é o esperado:
Figura 4 – Resultado
O valor ainda está como true. Ainda está assim porque como disse acima a aplicação precisa ser reiniciada. Se fecharmos e executarmos a aplicação novamente veremos que a propriedade agora estará como false. Veja o resultado na figura 5:
Figura 5 – Resultado com a aplicação reiniciada
Para evitarmos que a aplicação seja reiniciada para que a alteração seja aplicada podemos chamar o método RefreshSection da classe ConfigurationManager passando o nome da seção que queremos atualizar, no nosso caso a sessão appSettings. Abaixo, na exemplo 8, podemos ver como ficará o código 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);
Console.WriteLine(“\nConfiguração EnviarEmailDeErro alterado para ‘false’.\n”);
enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
Console.WriteLine(“Enviar email = {0}\n”, enviarEmail.ToString());
ConfigurationManager.RefreshSection(“appSettings”);
Console.WriteLine(“Seção appSettings atualizada.\n”);
enviarEmail =
Convert.ToBoolean(ConfigurationManager.AppSettings["EnviarEmailDeErro"]);
Console.WriteLine(“Enviar email = {0}\n”, enviarEmail.ToString());
Exemplo 8 – método RefreshSection
Figura 6 – Resultado com o método RefreshSection
Para adicionarmos uma nova configuração basta usarmos o método Add da propriedade Settings conforme a exemplo 9:
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Add(“Quantidade”, “12″);
config.Save();
int quantidade =
Convert.ToInt32(config.AppSettings.Settings["Quantidade"].Value);
Exemplo 9 – Adicionando informações no arquivo de configuração
Observação: Quando alteramos ou adicionamos algo no arquivo de configuração através de código, o arquivo app.config atualizado é o que está na pasta da aplicação, no nosso caso, na pasta Debug do projeto e não aquele que criamos no Visual Studio.
Se selecionarmos a opção Rebuild Solution no Visual Studio o arquivo de configuração atualizado será sobrescrito pelo antigo que está na solução do projeto.
ASP.NET Aplicações com Arquivos de Configuração
As alterações feitas nos arquivos de configuração de aplicações ASP.NET assim como aplicações Windows precisam ser reiniciadas para que sejam aplicadas, mas diferentemente de aplicações Windows, ao alterar qualquer informação no arquivo de configuração de uma aplicação ASP.NET a aplicação é reiniciada automaticamente acarretando na perda de todos os dados em memória.
Podemos ter vários arquivos de configuração em uma aplicação ASP.NET, um cenário onde utilizamos essa técnica é quando precisamos definir permissões em diretórios específicos.
Por exemplo, podemos ter um arquivo Web.config na raiz da aplicação contendo uma connection string e um arquivo Web.config em uma pasta que é restrita a usuários que pertencem a roleAdministrador. A imagem 6 nos mostra uma aplicação ASP.NET na janela Solution Explorer com dois arquivos Web.config:
Figura 7 – Projeto ASP.NET com vários arquivos de configuração
Abaixo, temos a exemplo 10 demonstrando o código do arquivo Web.config à nível de aplicação e mais abaixo, na exemplo 11, temos o código do arquivo Web.config à nivel de diretório (AreaRestrita):
<?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=Meubd; Integrated Security=SSPI;”/>
</connectionStrings>
</configuration>
Exemplo 10 – Web.config à nível de aplicação
<?xml version=”1.0″?>
<configuration>
<system.web>
<authorization>
<deny users=”*”/>
<allow roles=”Administrador”/>
</authorization>
</system.web>
</configuration>
Exemplo 11 – Web.config à nível de diretório
Criptografia
Nada impede de colocarmos dados confidenciais em arquivos de configuração como por exemplo login e senha do banco de dados. Para que não tenhamos problemas podemos criptografar uma determinada seção do arquivo de configuração. Para isso usamos os métodos ProtectSection e UnprotectSection da classe ConfigurationSection para criptografar e decriptografar, respectivamente.
Podemos configurar provedores de segurança adicionando-os no arquivo de configuração machine.config. Podemos também criar nossos próprios provedores de segurança criando uma classe herdando da classe ProtectedConfigurationProvider. O .NET Framework fornece dois provedores:
Vamos criar dois métodos, um chamado Criptografar e outro Decriptografar:
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();
}
}
Exemplo 12 – Método Criptografar
static void Decriptografar()
{
Configuration config =
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConnectionStringsSection section =
config.ConnectionStrings;
if (section.SectionInformation.IsProtected)
{
section.SectionInformation.UnprotectSection();
section.SectionInformation.ForceSave = true;
config.Save();
}
}
Exemplo 13 – Método Decriptografar
Se verificarmos nosso arquivo de configuração veremos que a seção connectionsStrings agora está criptografada. Abaixo, na exemplo 14 temos o arquivo de configuração sem criptografia e, na exemplo 15, o arquivo de configuração criptografado:
<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
<connectionStrings>
<add name=”MinhaStringDeConexao” connectionString=”Data Source=(local); Initial Catalog=Meubd; Integrated Security=SSPI;” />
</connectionStrings>
<appSettings>
<add key=”EnviarEmailDeErro” value=”true”/>
</appSettings>
</configuration>
Exemplo 14 – Arquivo de Configuração sem criptografia
<?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#”>
<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>
Exemplo 15 – Arquivo de Configuração com criptografia
Podemos ainda, nos arquivos de configuração de aplicações ASP.NET criptografar a partir da ferramenta ASP.NET IIS Registration Tool (Aspnet_regiis.exe) Para mais detalhes sobre ASP.NET IIS Registration Tool (Aspnet_regiis.exe), acesse o artigo Quando temos várias versões. NET Framework . Para criptografar a seção connectionStrings usamos o seguinte código no Visual Studio Command Prompt: aspnet_regiis -pe “connectionStrings” -app “/SampleApplication” -prov “RsaProtectedConfigurationProvider” e para decriptografar usamos: aspnet_regiis -pd “connectionStrings” -app “/SampleApplication”.
Observações: Como disse na introdução desse artigo, isso é apenas uma breve introdução à criptografia, para maiores detalhes visite o site http://msdn.microsoft.com/en-us/library/hh8x3tas.aspx.
Fontes: http://msdn.microsoft.com/en-us/library/1xtk877y(v=VS.100).aspx, http://msdn.microsoft.com/en-us/library/system.configuration.configuration.aspx, http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx, http://msdn.microsoft.com/en-us/library/2bc0cxhc.aspx,http://msdn.microsoft.com/en-us/library/cb6t8dtz.aspx, http://msdn.microsoft.com/en-us/library/zhhddkxy.aspx
Últimos Comentários