Escolar Documentos
Profissional Documentos
Cultura Documentos
15 - System.Diagnostics Parte 1
.Net
Boa Ideia
[ Fabio Gouw ]
.Net 27 Desenvolvendo um blog com ASP.NET Parte 2 dando a compreender com ainda
[ Vladimir Rech ] mais facilidade o contedo desta
edio. Ser um prazer contar com
sua companhia! Confira abaixo o
que teremos nesta revista:
Expediente Editorial
EDITORIAL
O
l pessoal, a segurana da informao um assunto cada vez mais discuti-
do na comunidade e no mercado de T.I e justamente por este motivo que
trouxemos na capa desta edio um artigo sobre criptografia de dados em
.NET, do nosso amigo Ericksen Sampaio, onde o mesmo aborda os principais concei-
tos a respeito desta tcnica e nos demonstra com um exemplo prtico como sim-
ples e fcil implementar rotinas de criptografia em nossos sistemas .NET, visto que o
mesmo j encapsula os algoritmos de criptografia mais difundidos no mercado.
Ano 3 - 27 Edio 2013 - ISSN 2179624-6
Alm disso, Fabio Gouw inicia uma srie onde nos dar uma verdadeira aula sobre
como implementar logs e realizar um monitoramento eficiente e elegante de nossas
aplicaes .NET, com a primeira parte do artigo sobre o uso de logs de eventos e dos
contadores de desempenho do Windows, nos apresentando os principais conceitos
Corpo Editorial por trs do mesmo. Com este artigo do Fbio voc com certeza ter muito mais
armas para combater problemas de desempenho e estabilidade de suas aplicaes,
alm de conseguir atuar de maneira preventiva se antecipando a possveis proble-
mas que possam vir a ocorrer em seus sistemas. Este artigo imperdvel.
Editor Geral
Ricardo Coelho (rcoelhorj@gmail.com) E para finalizar, dando continuidade ao artigo sobre a construo de blogs no ASP
.NET Vladimir Rech aborda aspectos de usabilidade com um breve uso do AjaxCon-
trolToolKit, alm de destacar aspectos fundamentais da interface com o usurio, nos
Jornalista Responsvel
apresentando conceitos e tcnicas extremamente valiosas do uso de folhas de estilo.
Kaline Dolabella - JP24185
Espero que gostem desta edio, um grande abrao e uma excelente leitura para
Na Web todos!
www.devmedia.com.br/revista-easy-dotnet-magazine
Publicidade
Para informaes sobre veiculao de anncio na revista ou no site e para fechar parcerias ou aes
Fale com o Editor!
especficas de marketing com a DevMedia, entre em contato com:
muito importante para a equipe saber o que voc est achando da revista: que tipo de artigo voc
gostaria de ler, que artigo voc mais gostou e qual artigo voc menos gostou. Fique a vontade para
Cristiany Queiroz
entrar em contato com os editores e dar a sua sugesto!
publicidade@devmedia.com.br
Se voc estiver interessado em publicar um artigo na revista ou no site .NET Magazine, entre em
contato com os editores, informando o ttulo e mini-resumo do tema que voc gostaria de publicar:
H Resumo DevMan
pouco tempo, quando a tecnologia ainda
no era muito presente em nosso cotidiano,
as informaes e grande parte dos processos Criptografia:
organizacionais eram geridos basicamente no papel, A criptografia uma tcnica utilizada h anos que com o passar
sendo armazenados em armrios ou cofres protegidos do tempo evoluiu a ponto de oferecer solues eficazes no que diz
por cadeados ou senhas. respeito segurana da informao. Hoje, ela uma ferramenta de
Atualmente este paradigma mudou, pelo menos para segurana amplamente utilizada nos meios de comunicao e consiste
uma parcela significativa da sociedade. As informaes basicamente na transformao de determinado dado ou informao
so processadas e armazenadas em meios digitais, a fim de ocultar seu real significado.
criando uma forte dependncia entre os sistemas de Este artigo apresenta os conceitos sobre criptografia, seus tipos, apli-
informao e as organizaes. Com o advento da in- cabilidade e como ela empregada no .NET por meio do namespace
ternet, os dados trafegam em meios pblicos, podendo System.Security.Cryptography. Ao final do artigo ser desenvolvida
ser interceptado por qualquer um que esteja mal inten- uma aplicao para criptografar dados usando um algoritmo simtrico.
cionado. Neste cenrio, uma falha na segurana destes Alm disso, iremos criar uma DLL contendo a classe de criptografia
contedos pode acarretar em enormes prejuzos para implementada, que poder ser reutilizada em outros projetos.
uma corporao. Ento, o que fazer para garantir tal
segurana? Existem diversos meios de proteo e um Em que situao o tema til:
deles o uso da criptografia. Ela no vai impedir que A criptografia pode ser utilizada em aplicaes e ambientes cuja
uma determinada informao seja interceptada, mas segurana das informaes algo relevante para o projeto, prin-
tem o objetivo de dificultar a compreenso do dado cipalmente em sistemas WEB, onde o dado trafega em um meio
capturado. Mas como isso feito? H vrios algoritmos pblico correndo um risco maior de ser interceptado, fato este que
de criptografia que cumprem este papel, cada um com pode gerar prejuzos enormes para uma organizao. O domnio
suas particularidades, porm a ideia central a mesma: das tcnicas de criptografia no algo complexo quando estamos
modificar a informao de forma que apenas o destina- trabalhando com o paradigma orientado a objetos, sendo essencial
trio consiga compreender a que foi transmitido. para a criao de aplicaes seguras.
Vale ressaltar que a criptografia no aplicada apenas
quando um dado enviado de um local a outro, ela
utilizada tambm em dispositivos de armazenamento
de dados (ex: discos rgidos, pen drives, storages), que
so alvos de ataques e roubos. Ou seja, de uma forma ento faz uso do algoritmo para descriptografar a mensagem e
geral, a criptografia vai garantir a confidencialidade aplica a mesma chave que foi utilizada pelo emissor para voltar
da informao. Nos prximos tpicos, veremos alguns mensagem em sua forma original. Sem a mesma, no possvel
conceitos relacionados a esta tcnica. decifrar a informao recebida.
Uma forma muita utilizada por invasores para descobrir esta
Criptografia simtrica chave utilizando a fora bruta, onde so utilizadas inmeras
A criptografia simtrica foi o primeiro tipo de cripto- combinaes de caracteres na tentativa de uma delas ser a chave
grafia criado. Os algoritmos que a utilizam tm como do algoritmo. Veja na Figura 1 o processo de criptografia simtri-
caracterstica principal o uso de uma mesma chave ca. Observe que a mesma chave utilizada nos algoritmos para
criptogrfica (Nota do DevMan 1) para criptografar cifragem e decifragem do texto.
ou descriptografar uma informao, por isso o adjetivo Como vantagens deste mtodo podemos citar a simplicidade na
simtrico d nome a esta tcnica. Exemplificando um sua implementao, uma vez que utilizada uma nica chave no
pouco este conceito, quando um emissor cifra uma men- processo de cifragem e decifragem do dado, alm da velocidade
sagem com um algoritmo de criptografia simtrico, ele deste processo em relao criptografia assimtrica, que vere-
utiliza uma chave, que representada por uma senha ou mos nos prximos tpicos, possibilitando assim que uma grande
um conjunto de bits para codificar os dados. O receptor quantidade de dados seja encriptada em pouco tempo.
Criptografia assimtrica
A criptografia assimtrica, tambm denominada como cripto-
grafia de chave pblica, possui como caracterstica bsica o uso
de duas chaves ao invs de uma, sendo elas:
Chave pblica: Chave que pode ser distribuda para outros
usurios.
Chave privada. Chave que deve ser mantida em segredo.
Como exemplos de padres de codificao conhecidos, podemos Other Project Types => Visual Studio Solution. O template Blank
citar: Base64, ASCII e Unicode Solution ir aparecer. Nossa solution ter o nome de Criptogra-
J a criptografia tem como principal meta o sigilo da informao, fiaEasyNet. Veja os passos descritos anteriormente na Figura 3.
fazendo uso de algoritmos complexos e sistema de chaves para
atingir seu propsito.
Criptografia em .NET
O .NET oferece uma srie de classes para trabalharmos com
criptografia simtrica e assimtrica em nossas aplicaes. Todas
estas classes esto presentes no namespace System.Security.
Cryptography.
Este namespace fornece uma gama de classes de algoritmos
de criptografia, dentre eles podemos citar os algoritmos RSA e
DAS, para criptografia assimtrica. J na criptografia simtrica
ele oferece, dentre outras, a classe Rijndael, que ser apresentada
nos prximos tpicos deste artigo durante a implementao da
aplicao para criptografia de dados.
Aplicao
Aps toda a teoria apresentada, vamos parte prtica. O objetivo
criar uma aplicao simples em ASP .NET onde primeiramente Figura 3.Template Blank Solution
ser realizado um cadastro de usurios contendo apenas o nome
e senha. A senha ser criptografada utilizando o algoritmo de Agora que temos uma soluo vazia criada, devemos adicionar
criptografia simtrico Rijndael e gravada em um banco de dados, a Class Library e o projeto web na mesma. Para isso, basta clicar
juntamente com o nome do usurio. Depois esta senha ser re- com o boto direito em cima da solution e escolher a opo Add =>
cuperada e descriptografada utilizando o mesmo algoritmo, para New Project. Desta vez, tanto o template da Class Library quanto
autenticar o acesso do usurio. o do projeto web (ASP.NET Web Application), esto localizados
A arquitetura da aplicao ser composta pelo projeto WEB, no mesmo sub menu: Visual Studio C#. O nome dado a Class
onde estaro presentes as pginas da aplicao e uma classe para Library e Web Application foram, respectivamente, Seguranca
a persistncia dos dados, e outra camada criada especialmente e CriptografiaWEB.
para conter a classe de criptografia. A estrutura do projeto fica como na Figura 4. Observe que
Vale ressaltar que esta no uma arquitetura ideal para o de- em nossa Solution temos os dois projetos criados. Um passo
senvolvimento de aplicaes, pois a classe de persistncia est importante que deve ser feito referenciarmos a Class Library
localizada na mesma camada das interfaces. Porm, como foco (Nota do DevMan 3) no projeto WEB. Para isto, basta clicar com
do artigo a criptografia, no iremos nos preocupar com esta o boto direito no projeto WEB e selecionar Add Reference. Na
questo. janela que ser apresentada, clique na aba Projects e selecione o
projeto Seguranca. Veja que na pasta references da aplicao web
j aparece o arquivo segurana incluso. Desta forma, podemos
usar as classes criadas no projeto Seguranca dentro do projeto
Tutorial CriptografiaWeb, bastando apenas fazer uma referncia utilizando
a clusula using.
15 }
16 catch (Exception)
17 {
18 throw;
19 }
20 }
criptografado, o tipo do processo, que ser neste momento de Listagem 3. Mtodo de criptografria
criptografia, e a referncia das variveis criadas na classe.
01 public string CriptografarTexto(string texto)
Na linha 10 instanciado um objeto da classe RijndaelManaged,
02 {
que herda da classe abstrata Rijndael. A classe RijndaelManaged 03 try
responsvel por criar o objeto de encriptao com base na chave e no 04 {
05 SetaValores(texto,
vetor de inicializao obtidos por meio do mtodo CreateEncryptor 06 criptografia,
(linha 11). Na linha 13, criado um objeto do tipo Memory Stream, 07 ref bytesChave,
cuja funo ser armazenar o texto criptografado na memria. Veja 08 ref bytesVetorInicializacao,
09 ref bytesTexto);
que ele foi adicionado dentro de um bloco using. Esta estrutura faz
com que os recursos sejam liberados automaticamente ao final do 10 Rijndael rijndael = new RijndaelManaged();
bloco, ou seja, o objeto do tipo Memory Stream que estava ocupando
11 ICryptoTransform IEncryptor = rijndael.CreateEncryptor
espao na memria, aciona o mtodo Dispose() implicitamente, que (bytesChave, bytesVetorInicializacao);
tem o papel de efetuar a liberao de recursos do objeto.
Nas linhas 15 a 20 so realizadas a criptografia e a escrita do texto 13 using (MemoryStream objMemoryStream = new MemoryStream())
14 {
criptografado no objeto objMemoryStream, por meio da classe
CryptoStream. Veja nas linhas 15 a 18 que esta classe recebe como 15 CryptoStream encryptor = new CryptoStream(
16 objMemoryStream,
parmetros de seu construtor o objeto do tipo Memory Stream
17 IEncryptor,
criado (linha 16), o objeto encriptador IEncryptor (linha 17) e o 18 CryptoStreamMode.Write);
modo como vai operar, que ser de escrita pois sua funo ser 19
20 encryptor.Write(bytesTexto, 0, bytesTexto.Length);
escrever o texto criptografado no objeto objMemoryStream, como
21 encryptor.Close();
pode ser visto na linha 20. 22 return Convert.ToBase64String(objMemoryStream.ToArray());
Por fim o mtodo retorna o texto criptografado obtido atravs 23 }
24 }
do mtodo ToArray() da classe MemoryStream (linha 22). 25 catch (Exception ex)
O mtodo para descriptografar o texto semelhante ao de 26 {
criptografia, conforme apresentado na Listagem 4. As diferenas 27 throw ex;
28 }
esto na chamada ao mtodo SetaValores, que agora recebe como 29 }
parmetro do tipo de operao o valor descriptografia. Outra
alterao est na linha 11, onde desta vez criado o objeto de Listagem 4. Mtodo de descriptografria
decriptao por meio do mtodo CreateDecryptor(). Por ltimo, 01 public string DescriptografarTexto(string texto)
retornado o texto original, onde os bytes referentes ao texto 02 {
decifrado so convertidos para string a partir do array de bytes 03 try
04 {
obtidos da memria (linha 22).
05 SetaValores(texto,
Em resumo a classe de Criptografia contm trs mtodos: Se- 06 descriptografia,
taValores(), CriptografarTexto e DescriptografarTexto. Observe 07 ref bytesChave,
que o processo para criptografar e decriptografar os dados no 08 ref bytesVetorInicializacao,
09 ref bytesTexto);
complexo, basta apenas realizar algumas converses e utilizar
10 Rijndael rijndael = new RijndaelManaged();
os mtodos presentes na classe Rijndael, que faz todo o restante 11 ICryptoTransform IDEcryptor = rijndael.CreateDecryptor
do trabalho. (bytesChave, bytesVetorInicializacao);
Ao realizar um Build no projeto verifique na pasta bin do mesmo 12
o arquivo Criptografia.dll gerado. Ele pode ser referenciado em 13 using (MemoryStream objMemoryStream = new MemoryStream())
14 {
outros sistemas para realizar o processo de cifragem de dados. 15 CryptoStream decryptor = new CryptoStream(
O prximo tpico destinado ao projeto WEB, contendo a classe 16 objMemoryStream,
de persistncia e as pginas da aplicao. Neste contexto, a classe 17 IDEcryptor,
Criptografia ser acionada no processo de cifragem e decifragem 18 CryptoStreamMode.Write);
19 decryptor.Write(bytesTexto, 0, bytesTexto.Length);.
de senhas. 20 decryptor.Close();
21 UTF8Encoding utf8 = new UTF8Encoding();
Persistncia 22 return utf8.GetString(objMemoryStream.ToArray());
As interfaces da aplicao consistem em trs pginas: uma para 23 }
24 }
cadastrar usurio e senha, outra para efetuar o login no sistema, 25 catch (Exception ex)
e uma terceira pgina que informa se o login foi realizado com 26 {
sucesso. Todas so pginas bem simples, pois o que realmente 27 throw ex;
importa a criptografia da senha, no momento do cadastro, e sua 28 }
29 }
descriptografia, no momento do login.
usuario e senha (linhas 17 e 18), na linha 19 temos um objeto Listagem 7. Code behind pgina CadastrarUsuarios.aspx
da classe Criptografia sendo instanciado e em seguida temos o
01 using System;
mtodo CriptografarTexto() sendo executado recebendo como pa-
02 using System.Web;
rmetro a senha do usurio (linha 20). Este mtodo ento retorna 03 using System.Web.UI;
a senha criptografada pelo algoritmo Rijndael. Por fim, os dados 04 using System.Web.UI.WebControls;
do usurio so persistidos na base de dados por meio do mtodo 05 using Seguranca;
InserirUsuario (linha 22). 06 namespace CriptografiaWeb
07 {
08 public partial class CadastrarUsuario :System.Web.UI.Page
Listagem 6. Mtodo para recuperar a senha do usurio 09 {
10 protected void Page_Load(object sender, EventArgs e)
01 public string BuscarSenhaUsuario(string usuario) 11 {
02 { 12 }
03 SqlConnection conn = null; 13 protected void btnCadastrar_Click(object sender, EventArgs e)
04 SqlCommandcmd = null; 14 {
05 string senha = string.Empty; 15 try
06 try
16 {
{
17 string usuario = txtUsuario.Text;
07 StringstrConexao =System.Configuration.ConfigurationManager.
ConnectionStrings[ConnectionString].ConnectionString; 18 string senha = txtSenha.Text;
09 conn = new SqlConnection(strConexao); 19 Criptografia objCriptografia = new Criptografia();
10 string querysql = @SELECT Senha from TBUsuario where 20 string senhaCriptografada =objCriptografia.
Usuario=@Usuario; CriptografarTexto(senha);
11 conn.Open(); 21 AcessaDados objAcessaDados = new AcessaDados();
12 cmd = new SqlCommand(querysql, conn); 22 objAcessaDados.InserirUsuario(usuario,senhaCriptografada);
13 cmd.Parameters.Add(newSqlParameter(@Usuario, usuario)); 23 Mensagem(Usurio inserido com sucesso);
14 senha = (string)cmd.ExecuteScalar();
24 }
15 return senha;
25 catch (Exception ex)
16 }
17 catch (SqlException sqlEx) 26 {
18 { 27 Mensagem(Falha ao inserir usurio: +ex.Message);
19 throw sqlEx; 28 }
20 } 29 }
21 finally 30 private void Mensagem(string pMensagem)
22 { 31 {
23 cmd.Connection.Close(); 32 ScriptManager.RegisterStartupScript(Page, Page.GetType(),
25 conn.Close();
33 Cadastro, alert( + pMensagem + );, true);
26 }
34 }
27 }
35 }
36 }
passou pelo processo de criptografia e voltou ao seu valor original Ericksen Viana Sampaio
testecriptografia. Desta forma, a senha ser igual informada ericksen.sampaio@gmail.com
na pgina de login, e o usurio ser redirecionado para a pgina Ericksen Viana Sampaio analista desenvolvedor de sistemas.
acesso.aspx. Atua na rea de desenvolvimento WEB utilizando ASP.NET C#.
Possui o ttulo de MCTS (ASP.NET 4.0). graduado em Cincia da
Computao pela Faculdade Pedro Leopoldo e ps-graduado em
Anlise de Sistemas pela UFMG.
O
ciclo de vida de um sistema no termina Neste artigo veremos como utilizar as classes de contadores de
quando a ltima linha de cdigo escrita e desempenho (Performance Counters) e log de eventos (Event Log)
o usurio d o aceite no que foi feito. Aps do Windows, mostrando tambm algumas dicas para tirar o melhor
o processo de desenvolvimento, que envolve proveito delas. Para exemplificar os conceitos aqui apresentados va-
as fases de levantamento de requisitos, programao e mos desenvolver uma aplicao do tipo windows service que fornece
homologao, entra uma nova etapa que a operao. informaes para seu monitoramento.
nela que vemos efetivamente o nosso esforo dar
resultados e o investimento feito dar retorno, pois Em que situao o tema til:
neste momento os nossos usurios passam a usufruir As classes do namespace System.Diagnostics podem ser utilizadas
dos benefcios que a aplicao desenvolvida traz. Por no fornecimento de dados para que a equipe de operaes possa
exemplo, uma aplicao de fora de vendas permite que monitorar a sade dos sistemas desenvolvidos, de forma a antecipar
os vendedores sejam mais rpidos nas suas operaes, qualquer problema que possa acontecer com as aplicaes como por
consequentemente fazendo mais pedidos por dia. exemplo desempenho inadequado ou falta de recursos para um bom
importante que a aplicao desempenhe seu papel funcionamento (espao em disco, memria, etc.).
corretamente. De nada vai adiantar nosso trabalho se o
sistema comear a apresentar problemas ou no conseguir
atender a demanda exigida pelos usurios. Uma aplicao nas classes de contadores de desempenho e log de eventos (Perfor-
de vendas que demora em seu tempo de resposta ir atrasar mance Counters e EventLog, respectivamente).
o trabalho dos vendedores. Um dos pontos chaves da fase Nosso exemplo ser uma aplicao do tipo windows services
de operao de um sistema consiste no seu monitoramento. que processa dados para calcular a comisso diria dos vende-
Apesar de isso ser responsabilidade do time de operao, dores. Mas antes de prosseguir com ele, precisamos explicar o
necessrio que o sistema disponibilize os dados necessrios que so os contadores de desempenho, log de eventos e tambm
para permitir que o monitoramento seja realizado. Mas os windows services.
como podemos fornecer os indicadores para que esse time
possa tomar as aes necessrias quando alguma coisa foge Windows services
do comportamento desejado? Windows services so um tipo de aplicao na qual no ne-
aqui que entra a utilidade das classes disponveis cessria uma sesso de usurio ativa no computador para que
no namespace System.Diagnostics. Elas permitem o ele execute. Como elas no precisam de interao com o usurio
fornecimento de dados a respeito do desempenho atual so largamente utilizadas para executar processamentos em se-
da aplicao (por exemplo, quantas requisies ela est gundo plano, geralmente executando tarefas de longa durao.
processando por segundo) e tambm detalhes de eventu- Aps ser instalado em um computador, possvel configurar o
ais problemas que ocorrem durante sua execuo, como windows service para que ele inicie e comece a trabalhar assim
falhas em conexo com o banco de dados. Daremos foco que a mquina seja ligada.
Nesse filtro, podemos escolher praticamente por todas as infor- pelo log de eventos: se os registros mais velhos sero excludos
maes de detalhe dos eventos, permitindo assim encontrar mais automaticamente, dando espao aos mais novos; ou ao contrrio,
rapidamente o dado que procuramos. se nenhum registro removido. Nesta ltima opo, quando a
aplicao tentar gravar o log, ela receber um erro.
Contadores de desempenho
Contador de desempenho (Performance Counters) um outro
componente do Windows que permite o monitoramento do que
acontece na mquina. Eles funcionam como o velocmetro de
um carro, mostrando em tempo real o que est acontecendo no
sistema. Existem inmeros contadores de desempenho que j vm
instalados com o sistema operacional. Eles exibem informaes a
respeito da memria, uso de CPU, disco, rede, etc. Por exemplo, na
Figura 9 temos um contador que mostra a porcentagem de uso do
processador. um grfico que atualizado a cada segundo onde
no eixo X temos o tempo e no eixo Y o valor do contador (neste
caso, vai de 0% a 100%). Alm disso, temos as informaes do l-
timo valor do contador monitorado, o mnimo, mximo e a mdia
apurada. Se em uma mquina esse grfico estiver constantemente
no topo, ela est trabalhando no limite da sua capacidade e nesta
situao interessante analisar se no seria melhor comprar um
Figura 7. Filtrando o log de eventos novo processador.
Da mesma forma que os windows services e o log de eventos,
Finalizando, vamos olhar as propriedades do log (Figura 8). a tela de visualizao dos contadores de desempenho tambm
Uma caracterstica importante que temos a definio de como pode ser acessada atravs da linha de comando do Windows,
o Windows ir controlar o espao em disco destinado aos logs (no digitando-se perfmon.
final das contas, o log de eventos guarda as suas informaes em Podemos remover um contador clicando nele e depois no boto
arquivos). Se uma aplicao ficar gravando eventos, uma hora ou X (vermelho). De forma similar, podemos adicionar um novo
outra essas informaes chegaro ao limite de armazenamento. contador clicando no boto + (verde). Isso ir abrir a janela mos-
Neste ponto, podemos definir qual o comportamento esperado trada na Figura 10. Para se escolher um contador de desempenho,
Neste artigo demonstramos como acessar as telas de visualizao dos windows services, log de
eventos e contadores de desempenho atravs da linha de comando do Windows. Essa a forma mais
rpida de encontr-los. Entretanto, todas as telas esto disponveis atravs do Painel de Controle do
Windows, nas Ferramentas Administrativas.
executada sem interveno direta de um usurio. Ento, a me- de dados e a remoo do arquivo texto (linha 19). Cada passo
lhor forma de monitorarmos essa aplicao atravs dos regis- feito por um mtodo prprio.
tros de eventos que ela deixa e dos contadores que medem seu O primeiro mtodo o CriarObjetoComissao (linha 22). A pri-
funcionamento. meira coisa que ele faz pegar o nome do arquivo, utilizando para
Mas antes de entrar em detalhes do windows service, log de isso o mtodo utilitrio do .NET Path.GetFileNameWithoutExtension
eventos e contadores de desempenho, vamos entender melhor a (linha 24) do namespace System.IO, e extrair a data das vendas e
regra de negcio por trs do processamento da nossa aplicao o nome do vendedor. Depois, o arquivo lido com o uso da classe
de exemplo. StreamReader (linha 30), para se recuperar os valores das vendas.
O nosso sistema fictcio atende uma rede de lojas de instrumen- Como cada informao na linha separada pelo caractere |,
tos musicais. Todo final de dia, as filiais enviam para a matriz, utilizamos o mtodo Split do .NET para transformar a linha em
onde se encontra a central de processamento de dados, vrios um array com 4 posies. Como o que nos interessa est na lti-
arquivos de texto contendo os dados das vendas que ocorreram ma posio, o valor total da venda, ento convertemos esse dado
no dia, separados por vendedor. para o tipo double e o somamos na propriedade TotalVendas do
Existem vrias contabilizaes que a empresa precisa fazer, mas objeto Comissao.
a que ns estamos interessados agora a totalizao das comisses Carregadas as informaes, efetuamos o clculo da comisso
de cada vendedor. Essas comisses so calculadas como sendo pelo mtodo CalcularValorComissaoVendas (linha 45). Esse m-
6% do total de vendas que cada pessoa fez no dia. Assim que todo bem simples, atualizando o valor da comisso com 6% do
consolidados, esses valores so armazenados numa base de dados total de vendas.
para depois serem consumidos pelo sistema de pagamentos. Ao Em seguida, o mtodo SalvarComissao (linha 51) ir guardar
observarmos o cdigo da Listagem 1, vemos a classe Comissao os dados em uma base de dados SQL Server CE, dentro da tabela
que contm essas informaes: nome do vendedor, data, total de Comissoes. A primeira coisa a ser realizada recuperar a string
vendas e valor da comisso. de conexo para este banco de dados, armazenada no arquivo de
configurao (linha 54). Com isso, podemos abrir uma conexo
com esta base, executando o comando INSERT para incluir os
Listagem 1. Classe de Comisso
dados (linha 53 63. Note que estamos utilizando um comando
01 usingSystem; parametrizado, ou seja, ao invs de passar os dados a serem inclu-
02 usingSystem.Collections.Generic;
dos direto no comando SQL, fazemos uso de parmetros que so
03 usingSystem.Linq;
04 usingSystem.Text; adicionados execuo da query pelo mtodo ExecuteNonQuery.
05 Isso uma boa prtica, pois impede ataques de injeo de SQL
06 namespaceComissaoVendas.Entidades
na aplicao.
07 {
08 publicclassComissao Por fim, o mtodo RemoverArquivo (linha 71) simplesmente
09 { apaga o arquivo que j foi processado, utilizando para isso o
10 publicstringNomeVendedor{get;set;}
11 publicDateTimeData{get;set;}
mtodo Delete da classe File.
12 publicdoubleTotalVendas{get;set;}
13 publicdoubleValorComissao{get;set;} Criando o windows service
14 }
15 } Um windows service nada mais que uma aplicao executvel
que roda em segundo plano. Entretanto, necessria uma srie
de configuraes especiais para que esse executvel possa ser
Na Listagem 2 temos o cdigo para processar os arquivos de tratado como um servio pelo Windows. Felizmente o Visual
venda. Para identificar cada arquivo, convencionou-se que eles Studio j nos fornece um modelo especialmente criado para este
viriam com a data das vendas e o nome do vendedor. Por exemplo, tipo de aplicao, disponvel como um projeto em New Project
um arquivo com nome 20121119FULANO.txt representa todas as Installed Templates Visual C# Windows Windows
vendas de FULANO no dia 19/11/2012. Dentro do arquivo, linha Service. Este modelo j cria a base para o windows service, na
por linha, vm as informaes de cada venda: nome do produto, qual inclumos o cdigo da Listagem 3.
valor unitrio, quantidade vendida e total da venda, separadas
pelo caractere pipeline |. Um windows service possui dois mtodos principais. O primeiro
Para cada arquivo criado uma instncia da classe Processador- o mtodo OnStart (linha 26), que chamado no momento em
ArquivoVendas, responsvel por toda regra de clculo e persis- que o servio inicia, seja automaticamente pelo boot do sistema
tncia dos dados. Veja que o mtodo ProcessarArquivo (linha 13) operacional ou pela ao manual de um usurio.
desta classe, que recebe como parmetro o caminho do arquivo a como se ele fosse o mtodo Main de uma aplicao Console, po-
ser processado, dividi-se em 4 partes: a criao do objeto (linha 16) dendo at receber parmetros de linha de comando (Nota do
que armazena os dados de comisses, o clculo das comisses DevMan 1). importante citar que no neste mtodo que o
(linha 17), a gravao dos dados (linha 18) totalizados no banco cdigo de processamento do servio deve ficar, mas sim apenas
01 usingSystem; 42 returncomissao;
02 usingSystem.IO; 43 }
03 usingComissaoVendas.Entidades; 44
04 usingSystem.Data.SqlServerCe; 45 privateComissaoCalcularValorComissaoVendas(Comissaocomissao)
05 usingSystem.Configuration; 46 {
06 47 comissao.ValorComissao=comissao.TotalVendas*0.06;
07 namespaceComissaoVendas.RegrasNegocio 48 returncomissao;
08 { 49 }
09 publicclassProcessadorArquivoVendas 50
10 { 51 privatevoidSalvarComissao(Comissaocomissao)
11 privatestring_caminhoArquivo; 52 {
12 53 stringcomandoInsert=
13 publicvoidProcessarArquivo(stringcaminhoArquivo) INSERT INTO Comissoes (Vendedor, Data, TotalVendas, ValorComissao)
14 { VALUES (@Vendedor, @Data, @TotalVendas, @ValorComissao);
15 _caminhoArquivo=caminhoArquivo; 54 SqlCeConnection conexao = new SqlCeConnection(
16 Comissaocomissao=CriarObjetoComissao(); ConfigurationManager.ConnectionStrings[db].ConnectionString );
17 comissao=CalcularValorComissaoVendas(comissao); 55 SqlCeCommandcomando=newSqlCeCommand
18 SalvarComissao(comissao); (comandoInsert,conexao);
19 RemoverArquivo(); 56 comando.Parameters.AddWithValue(@Vendedor,comissao.
20 } NomeVendedor);
21 57 comando.Parameters.AddWithValue(@Data,comissao.Data);
22 privateComissaoCriarObjetoComissao() 58 comando.Parameters.AddWithValue(@TotalVendas,comissao.
23 { TotalVendas);
24 stringnomeArquivo=Path.GetFileNameWithoutExtension 59 comando.Parameters.AddWithValue(@ValorComissao,
(_caminhoArquivo); comissao.ValorComissao);
25 Comissaocomissao=newComissao() 60 conexao.Open();
26 { 61 try
27 Data=DateTime.Parse(nomeArquivo.Substring(0,10)), 62 {
28 NomeVendedor=nomeArquivo.Substring(10) 63 comando.ExecuteNonQuery();
29 }; 64 }
30 using(StreamReadersr=newStreamReader(_caminhoArquivo)) 65 finally
31 { 66 {
32 string conteudoArquivo = sr.ReadToEnd(); 67 conexao.Close();
33 string[] linhas = conteudoArquivo.Split(new [] 68 }
{ Environment.NewLine },StringSplitOptions.RemoveEmptyEntries); 69 }
34 foreach(stringlinhainlinhas) 70
35 { 71 privatevoidRemoverArquivo()
36 string[ ]partesLinha=linha.Split(|.ToCharArray()); 72 {
37 //Ex.: VIOLO|2|450,00|900,00 73 File.Delete(_caminhoArquivo);
38 doublevalorVenda=double.Parse(partesLinha[3]); 74 }
39 comissao.TotalVendas+=valorVenda; 75 }
40 } 76 }
41 }
para recuperar todos os arquivos TXT existentes na pasta con- possamos consultar o mesmo posteriormente. E o melhor lugar
figurada no windows service. Isto feito chamando o mtodo para isso o log de eventos.
esttico GetFiles (linha 53). Para cada arquivo encontrado, feita O acesso ao log de eventos, dentro do .NET, feito basicamen-
uma chamada ao mtodo ProcessarArquivo (linha 62). Quando te atravs da classe EventLog, presente no namespace System
todos os arquivos tiverem sido processados, faz-se uma pausa .Diagnostics. O mtodo WriteEntry recebe como argumento o
na execuo deste loop, para economizar processamento, e o nome do source na qual o registro do evento ser categorizado,
ciclo recomea. a mensagem que ser gravada e o tipo da mensagem (erro, aler-
ta ou informao). este o mtodo que usamos no cdigo de
GravarErroLogWindows (Listagem 3, linha 78).
Em primeiro lugar, a mensagem a ser gravada no log formatada
para conter o caminho (linha 81) do arquivo que estava sendo proces-
sado quando o erro ocorreu e os detalhes do erro (linha 83) contido
na exceo gerada pelo .NET. sempre bom guardar o mximo de
informaes disponveis para ajudar na identificao do problema.
Em seguida, verificamos se o tamanho da mensagem no ex-
cedeu o limite mximo de caracteres (l.inha 85) que podem ser
guardados no log de eventos (este valor gira em torno de 32000
bytes, dependendo da verso do Windows). O motivo que a
chamada ao WriteEntry no trunca o texto e teremos um erro
caso muita informao tente ser gravada. Isso um problema
para ns, visto que perderamos a mensagem de erro. Outra
causa comum de no se poder gravar eventos no log a falta de
permisso do usurio.
A Figura 13 mostra um exemplo do log gravado da nossa apli-
cao de clculo de comisso de vendas. Nela, o erro encontrado
foi impossibilidade de se acessar o arquivo da base de dados SQL
Server CE.
Figura 12. Debuggando o windows service
Log de eventos
Quando ocorre um erro em uma aplicao do tipo Windows
Forms, geralmente o prprio usurio pode fornecer detalhes do
que aconteceu simplesmente tirando um print screen da mensa-
gem que ele recebe. J no caso de windows services importante
termos uma forma de armazenar os detalhes dos erros ocorridos
pois esse tipo de aplicao no tem interao com usurio, e con- Figura 13. Exemplo personalizado do log de eventos
sequentemente no temos como depender de uma pessoa para
nos reportar o erro. Contadores de desempenho
Dentro do nosso exemplo, vamos supor que os arquivos penden- Como a nossa aplicao de exemplo um rob para processa-
tes comeassem a se acumular na pasta de processamento. Qual mento de arquivos, vamos incluir um contador de desempenho
seria a causa? Sem o detalhamento do erro no teramos como que gere um indicador de quantos arquivos esto na pasta de
saber se o problema a falta de permisso de escrita na pasta, processamento esperando para serem lidos. O nome deste conta-
se h algum erro de programao, etc. Por isso, importante dor personalizado Arquivos pendentes, agrupado dentro da
armazenarmos os detalhes dos erros em algum lugar para que categoria ComissaoVendas.
01 usingSystem.ServiceProcess; 44 _contador.RawValue=arquivos.Length;
02 usingSystem.Threading; 45 Thread.Sleep(1000);
03 usingSystem.IO; 46 }
04 usingComissaoVendas.RegrasNegocio; 47 }
05 usingSystem; 48
06 usingSystem.Configuration; 49 privatevoidProcessarLoop(objectstate)
07 usingSystem.Diagnostics; 50 {
08 usingSystem.ComponentModel; 51 while(_emProcessamento)
09 usingSystem.Text; 52 {
10 53 string[]arquivos=Directory.GetFiles(
11 namespaceComissaoVendas.WindowsService _diretorioArquivos,*.txt);
12 { 54 foreach(stringarquivoinarquivos)
13 publicpartialclassServicoComissaoVendas:ServiceBase 55 {
14 { 56 ProcessarArquivo(arquivo);
15 privatestring_diretorioArquivos; 57 }
16 privateThread_threadProcessamento; 58 Thread.Sleep(1000);
17 privateThread_threadContador; 59 }
18 privatevolatilebool_emProcessamento=false; 60 }
19 private PerformanceCounte _contador= new PerformanceCounter( 61
.NOME_CATEGORIA_CONTADOR, Constantes.NOME_CONTADOR,false); 62 privatevoidProcessarArquivo(stringarquivo)
20 63 {
21 publicServicoComissaoVendas() 64 try
22 { 65 {
23 InitializeComponent(); 66 if(File.Exists(arquivo))
24 } 67 {
25 68 ProcessadorArquivoVendasprocessador=
26 protectedoverridevoidOnStart(string[]args) newProcessadorArquivoVendas();
27 { 69 processador.ProcessarArquivo(arquivo);
28 if(args.Length>0&&args[0]==debug) 70 }
29 Debugger.Launch(); 71 }
30 _diretorioArquivos= 72 catch(Exceptionex)
ConfigurationManager.AppSettings[DiretorioArquivos]; 73 {
31 _emProcessamento=true; 74 GravarErroLogWindows(arquivo,ex);
32 _threadProcessamento=newThread(ProcessarLoop); 75 }
33 _threadContador=newThread(ProcessarContagem); 76 }
34 _threadProcessamento.Start(); 77
35 _threadContador.Start(); 78 privatevoidGravarErroLogWindows(stringarquivo,Exceptionex)
30 } 79 {
31 80 StringBuildersb=newStringBuilder();
32 protectedoverridevoidOnStop() 81 sb.AppendFormat(ARQUIVO:{0},arquivo);
33 { 82 sb.AppendLine();
34 _emProcessamento=false; 83 sb.AppendFormat(ERRO:{0},ex.ToString());
35 _threadContador.Join(); 84 stringmensagem=sb.ToString();
36 _threadProcessamento.Join(); 85 if(mensagem.Length>=Constantes.TAM_MAXIMO_CHARS_LOG)
37 } 86 mensagem=mensagem.Substring(0,
38 Constantes.TAM_MAXIMO_CHARS_LOG);
39 privatevoidProcessarContagem() 87 EventLog.WriteEntry(Constantes.SOURCE_EVENTLOG,mensagem,
40 { EventLogEntryType.Error);
41 while(_emProcessamento) 88 }
42 { 89 }
43 string[]arquivos= 90 }
Directory.GetFiles(_diretorioArquivos,*.txt);
NumberOfItems32 e NumberOfItems64 Estes tipos de con- na Figura 14 o grfico resultante: quando ele sobe, quer dizer
tadores podem ser utilizados para se rastrear a quantidade de que arquivos novos esto sendo colocados na pasta para proces-
itens existentes no momento. Por exemplo, o contador Memory\ samento; quando ele desce, os arquivos esto sendo consumidos
Available Bytes deste tipo. No nosso exemplo, o contador que pelo nosso windows service.
mostra a quantidade de arquivos que esto pendentes de proces-
samento no momento. A diferena entre os dois contadores que
o com final 32 trabalha com nmeros com 4 bytes, e o de final 64
trabalha com 8 bytes.
RateOfCountsPerSecond32 e RateOfCountsPerSecond64
Este tipo mostra a mdia de operaes que ocorrem em uma
determinada unidade de tempo. Ele calculado automaticamente
pelo sistema operacional e na nossa aplicao de exemplo poderia
ser um contador que mostrasse a taxa de arquivos processados por
segundo. O contador System\ File Read Operations/sec tambm
deste tipo.
AverageTimer32 J este tipo mostra o tempo mdio em que
uma operao leva para ser finalizada. Tambm calculado pelo
sistema operacional, mas necessita de outro contador de desem-
penho auxiliar (AverageBase) para funcionar. Poderamos ter um
contador que mostrasse quanto tempo gasto para se processar 1
GB de arquivos. Um exemplo deste tipo que j existe no Windows Figura 14. Contador de desempenho de arquivos pendentes de processamento
o PhysicalDisk\ Avg. Disk sec/Transfer.
Instalando o servio, o log e o contador
Nota Aps criar o windows service e efetuar as chamadas aos conta-
dores de desempenho e log de eventos, chega o momento em que
Apesar do nosso exemplo apenas demonstrar a escrita em um contador de desempenho, as classes
precisamos instalar esses componentes para que o servio possa
do namespace System.Diagnostics permitem tambm a leitura desses dados. Um sistema poderia,
ser executado. Isso pode ser feito utilizando-se uma classe do
por exemplo, obter informaes da quantidade trafegada na rede atravs dos contadores. De
tipo Installer, adicionada junto classe do windows service. Para
maneira similar, apesar de apenas estarmos escrevendo no log de eventos, tambm possvel ler
cri-la, basta clicar com o boto direito sobre a classe do windows
o contedo de um log do Windows.
service e selecionar a opo Add Installer (Figura 15).
Nota
Figura 16. Propriedades de instalao do windows service Em seguida temos a criao da categoria ComissaoVendas e
do contador de desempenho Arquivos pendentes. Para se criar
A classe Installer disponibiliza uma srie de eventos nos quais a categoria necessrio agrupar um ou mais objetos contendo os
podemos incluir cdigo para personalizar a instalao. Iremos dados dos contadores (CounterCreationData) dentro de uma cole-
utilizar alguns desses eventos para a criao do log de eventos o (CounterCreationDataCollection). Esta coleo passada en-
ComissaoVendasApp e do contador de desempenho Arquivos to para o mtodo esttico Create (linha 33) da classe Performan-
pendentes. Vamos olhar a Listagem 5, que mostra o cdigo por ceCounterCategory, que efetua ento a criao do(s) contador(es).
trs da classe ProjectInstaller. Nessa listagem vamos utilizar dois Uma dvida pode surgir nesse momento: a criao desses dois
eventos: AfterInstall e AfterUnistall. No primeiro vamos colocar o itens no poderia ser feita quando o windows service iniciasse?
01 usingSystem.ComponentModel; 24
02 usingSystem.Configuration.Install; 25 CounterCreationDatacontadorMedia=newCounterCreationData()
03 usingSystem.Diagnostics; 26 {
04 27 CounterName=Constantes.NOME_CONTADOR,
05 namespaceComissaoVendas.WindowsService 28 CounterHelp=Constantes.NOME_CONTADOR,
06 { 29 CounterType=PerformanceCounterType.NumberOfItems32
07 [RunInstaller(true)] 30 };
08 publicpartialclassProjectInstaller:System.Configuration.Install.Installer 31 colecaoContadores.Add(contadorMedia);
09 { 32
10 publicProjectInstaller() 33 PerformanceCounterCategory.Create( Constantes.NOME_CATEGORIA_
11 { CONTADOR,Constantes.NOME_CATEGORIA_CONTADOR,
12 InitializeComponent(); 34 PerformanceCounterCategoryType.SingleInstance,colecaoContadores);
13 } 35 }
14 36 }
15 privatevoidProjectInstaller_AfterInstall(objectsender, InstallEventArgse) 37
16 { 38 privatevoidProjectInstaller_AfterUninstall(objectsender,InstallEventArgse)
17 if(!EventLog.Exists(Constantes.EVENTLOG)||!EventLog.SourceExists 39 {
( Constantes.SOURCE_EVENTLOG)) 40 if(EventLog.Exists(Constantes.EVENTLOG))
18 EventLog.CreateEventSource(Constantes.SOURCE_EVENTLOG, 41 EventLog.Delete(Constantes.EVENTLOG);
Constantes.EVENTLOG); 42
19 43 if(PerformanceCounterCategory.Exists( Constantes.NOME_CATEGORIA_
20 if(!PerformanceCounterCategory.Exists( Constantes.NOME_ CONTADOR))
CATEGORIA_CONTADOR)) 44 PerformanceCounterCategory.Delete( Constantes.NOME_CATEGORIA_
21 { CONTADOR);
22 45 }
23 CounterCreationDataCollectioncolecaoContadores= 46 }
newCounterCreationDataCollection(); 47 }
A princpio a resposta sim, mas ela traz um problema. As consumir os dados que eles fornecem. Existem ferramentas que
criaes de logs de eventos e de contadores de desempenho automatizam o processo de coleta e anlise desses indicadores,
precisam ser efetuadas com permisses administrativas na como por exemplo, o System Center da Microsoft ou mesmo
mquina. Se fossemos colocar a criao deles junto da execuo recursos prprios do Windows. Por exemplo, seria possvel criar
do windows service seria necessrio configurar um usurio com uma configurao para nosso contador de arquivos pendentes,
alto privilgio para execuo do servio, e isso um problema de forma que quando o mesmo ultrapassar o valor 100, seja en-
de segurana. viado um alerta ao administrador do ambiente, para que ele possa
J no evento ProjectInstaller_AfterUninstall fazemos o contr- proativamente verificar se h algum problema com os servidores
rio. Caso exista o log e o contador, ambos so removidos. Para o ou mesmo entrar em contato com a equipe de desenvolvimento
primeiro usamos o mtodo EventLog.Delete (linha 41), passando antes mesmo de o erro ser percebido pelos usurios.
o nome do log. J para o segundo, usamos PerformanceCounter- recomendvel sempre que haja um novo projeto, que seja
Category.Delete (linha 44), passando o nome da categoria. conversado e combinado entre as equipes de desenvolvimento e
Compilado o windows service com a nova classe Installer, pode- operaes como ser feito o monitoramento da aplicao e quais
mos instalar o servio, o log de eventos e o contador de desempenho so os indicadores mais significativos. nesta integrao entre
utilizando o utilitrio installutil. Ele um aplicativo que vem junto essas duas equipes que reside a grande vantagem de se utilizar
do .NET Framework e pode ser encontrado na pasta C:\Windows\ essas classes do namespace System.Diagnostics.
Microsoft.NET\Framework\v4.0.30319\. Note que o caminho des-
ta pasta pode ser diferente, dependendo de como o Windows foi Fabio Gouw
instalado e de qual verso do .NET estamos trabalhando. fabiogouw@gmail.com
Executamos ento a instalao do servio passando como ar- http://galorebr.blogspot.com
gumento o caminho do executvel (exemplo na Figura 17). Este Certificado Microsoft (MCTS, MCPD), trabalha com TI h nove anos.
aplicativo ento ir analisar o contedo do executvel em busca Atualmente faz parte de uma equipe de desenvolvimento de sistemas para
de qualquer classe do tipo Installer. Ao encontr-lo, o installutil as um rgo do Estado de So Paulo.
executa (no nosso exemplo, encontrar a ProjectInstaller, rodando
todo o cdigo de instalao do windows service, do log de eventos Permisses para uso do EventLog - Windows 2003
e do contador de desempenho). http://galorebr.blogspot.com.br/2008/03/permisses-para-uso-do-
eventlog-windows.html
Acessando arquivos com StreamReader e StreamWriter
http://codigoweb.wordpress.com/2010/02/22/acessando-arquivos-com-
streamreader-e-streamwriter/
Programando threads em C#
http://imasters.com.br/artigo/19541/c-sharp/programando-threads-em-c
System Center 2012
http://www.microsoft.com/en-us/server-cloud/system-center/default.aspx
How to Create an Alert Generating NT-Event-Log-Based Rule in System
Center Essentials
http://technet.microsoft.com/en-us/library/ff730470.aspx
Windows Server Performance Monitor - Data Collector Sets and Alerts
http://www.computerperformance.co.uk/HealthCheck/Alerts.htm
Figura 17. Instalando o windows service Injeo de SQL
http://pt.wikipedia.org/wiki/Inje%C3%A7%C3%A3o_de_SQL
Para remover essa instalao, basta executar novamente o co-
EventLog Class
mando installutil incluindo o parmetro /u. Aps o processo
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx
de desinstalao do servio, chamado o evento ProjectInstal-
ler_AfterUninstall, responsvel por remover o log de eventos e o PerformanceCounterType Enumeration (tipos de contadores)
contador de desempenho. http://msdn.microsoft.com/en-us/library/system.diagnostics.
performancecountertype.aspx
Concluso EventLogInstaller Class
odo o nosso trabalho para criar logs de eventos e contadores
T http://msdn.microsoft.com/en-us/library/system.diagnostics.eventloginstaller.aspx
de desempenho personalizados de nada vai adiantar se ningum
E
xistem muitas plataformas para desenvolver recursos. Hoje h uma grande variedade de plataformas, linguagens,
aplicaes Web. Desde tecnologias que ocultam design patterns, boas prticas e ferramentas que podem ajudar a
grande parte da complexidade do gerenciamen- atingir seus objetivos.
to do estado da aplicao at aquelas que deixam este ASP.NET em conjunto com Web Forms uma destas opes que
totalmente sob a responsabilidade do programador, veio sendo consolidado durante os anos. Iniciando as novidades para
possvel fazer praticamente qualquer coisa em um enriquecer a interface com o usurio vamos conhecer a biblioteca
browser. AJAX Control Toolkit que, quando utilizada com o ASP.NET, torna suas
A justificativa para usar uma aplicao Web sendo aplicaes mais interessantes adicionando pouco ou quase nenhum
executada em um browser em vez de uma aplicao trabalho no desenvolvimento.
desktop que esta principalmente dispensa a instalao Falando em melhorias na interface, para aqueles que leram a primeira
e configurao da parte do usurio e um maior controle parte do artigo devem ter achado que a aplicao ficou sem graa,
do programador j que todos os usurios tero o mesmo afinal, nenhuma formatao foi feita. Nesta edio vamos criar uma
cdigo e o mesmo ambiente. Quanto configurao, formatao usando as folhas de estilo CSS. Durante o desenrolar do
por estar localizada em um servidor, basta que esta no texto voc ir entender porque sempre melhor usar esta formatao
prprio servidor. em sua aplicao Web.
Dentro deste cenrio surgiu h alguns anos atrs a Evoluindo um pouco mais na utilizao do Entity Framework para o
plataforma Active Server Pages. Sua principal motivao trabalho com os dados, veremos o que pode ser feito para estender
foi dar ao desenvolvedor a possibilidade de manipular as classes originalmente mapeadas no banco de dados atravs do
com facilidade a formatao das pginas no servidor uso das partial classes.
da mesma forma que na poca ele podia fazer com as
aplicaes desktop, arrastando controles visuais para Em que situao o tema til:
um designer e fazendo a sua formatao. Aliado a isto Voc vai poder usar este artigo como referncia para os recursos
tnhamos tambm a possibilidade de escrever pequenas do ASP.NET e tambm para tirar dvidas sobre como usar alguns
partes de cdigo para responder a eventos como cliques componentes para melhorar os recursos da sua interface ou ainda,
em botes ou links e preenchimentos em campos. Uma como tirar proveito das folhas de estilo CSS para criar determinados
vez compilada e hospedada em um servidor, estas pgi- estilos de formatao e efeitos em sua aplicao.
nas eram acessadas pelos browsers normalmente como
as demais aplicaes, mas o servidor que recebia dados
sobre o browser que estava fazendo a solicitao gerava bsica para a pgina e cdigo em uma linguagem gerenciada do
o cdigo HTML necessrio para exibir esta pgina j .NET para manipular as regras de negcio.
adaptada a verso do browser para (tentar) otimizar Com o Visual Studio o desenvolvedor tem a opo de arrastar
este processo. e soltar os controles visuais para a interface e fazer a formata-
Esta tecnologia foi a base para o ASP.NET. Neste so o usando os editores de propriedades ou, se preferir, editar
usados controles de servidor para criar uma formatao manualmente as tags HTML referentes aos controles e fazer
a formatao usando suas propriedades, ou ainda, fazendo Outro ponto de vista importante com relao formatao.
uso de classes em CSS. Esta forma de trabalhar com o ASP Esta precisa permitir sua fcil manuteno e modificao, algo
.NET ficou conhecida como ASP.NET Web Forms. Lembrando que difcil de fazer caso esteja vinculada diretamente com as
que um formulrio tudo o que est localizado dentro da tag propriedades do controle. Para simplificar, use folhas de estilo,
<form> que nativa do HTML. No possvel usar controles que veremos mais a frente.
ASP.NET fora desta TAG. Por fim, existem validaes e tarefas que podem ser feitas ainda
Um dos diferenciais do ASP.NET a possibilidade de manipular no browser do seu usurio com o JavaScript. Algumas destas fo-
a pgina usando linguagens de programao originalmente no ram apresentadas na primeira parte do artigo e com o ASP.NET
orientadas para a Web para obter os dados da pgina e enviar pode-se usar alguns server controls como os validators para gerar
para o servidor. Sem o ASP.NET necessrio conhecimento a validao do lado cliente automaticamente.
avanado de JavaScript, HTML e DOM (Nota do DevMan 1)
para fazer esta tarefa.
Um dos problemas ao usar ASP.NET que no tem muito
controle com o cdigo gerado no servidor para renderizar e
Nota do DevMan 1
enviar a pgina para o browser que fez a solicitao. Em muitos
DOM a sigla para Document Object Model e consiste em um conjunto de prticas e tcnicas
casos, se o desenvolvedor simplesmente arrastar componentes (patterns) usando HTML, XHTML (um subconjunto de HTML e XML) para fazer a manipulao dos
sem tomar cuidado e sem seguir padres de desenvolvimento, dados de documentos HTML e XML.
o carregamento e comportamento destas pginas podem ficar
comprometidos por tornar-se muito pesado devido ao excesso
de cdigo gerado. AJAX
importante considerar que o cdigo que vemos no Visual Os controles do ASP.NET so todos baseados no servidor. Entre-
Studio referente s marcaes HTML para os server side controls tanto, para atualizar e construir pginas baseadas nestes controles,
diferente daquele que enviado para o browser. Lembre-se de necessrio que haja um processo conhecido como server round
que browsers, mesmo os mais sofisticados, interpretam apenas trip, que o envio da requisio para o servidor que vai renderizar
HTML e JavaScript e o que d para fazer com estes dois no a pgina e enviar a mesma novamente para o browser.
pouca coisa. Infelizmente, muitas vezes, pela gerao do cdigo Este processo requer que toda a pgina do lado do servidor seja
ser automatizada e considerada um cenrio padro, muito cdigo reconstruda, o que quase sempre um processo lento dependen-
desnecessrio gerado. do do nmero de controles da pgina.
Por causa de programadores descuidados e de falta de critrio Para resolver este problema e tornar a experincia do usurio
na hora de usar o ASP.NET, hoje existe um nmero considervel em aplicaes Web mais atraente desenvolveu-se alguns anos
de desenvolvedores Web que abandonaram a sua utilizao e atrs um conjunto de tecnologias denominado AJAX, tecnologia
esto voltando-se para o HTML puro novamente, o que garante que em conjunto com o XMLHttpRequest dos browsers permite
maior controle da aplicao, embora, aumente consideravelmente a atualizao parcial do contedo de uma pgina Web.
o trabalho do desenvolvimento. Com esta tecnologia o servidor fornece dados que iro partici-
Paralelamente a isto tudo existem programadores com bom par da renderizao da pgina no browser do usurio. Os dados
senso que se aprofundam nas tecnologias que esto adotando fazem parte do contedo que pode corresponder a controles
para fazer destas a melhor aplicao. O ASP.NET bom e a prova como botes, caixas de listagem e texto que j foram carregados
disso o nmero de usurios existente e de empresas que criam previamente e que agora, so apenas preenchidos com os dados
componentes personalizados para esta plataforma. Alm disto, vindos do servidor.
desde a verso 3.5 do Framework .NET possvel associar o A biblioteca inicial para quem deseja iniciar o trabalho com o
desenvolvimento ASP.NET com design patterns como o MVC AJAX no Visual Studio e no ASP.NET o AJAX Control Toolkit.
que exige a separao bem definida entre as camadas de dados Isso porque existem outras. Esta indicada para o incio da com-
(Model), exibio destes (View) e da forma como estas duas se preenso e vai ser usada no projeto de exemplo.
comunicam (Controller).
Uma das boas prticas a ser seguida no desenvolvimento ASP
.NET usar server controls (TextBox, Label, ComboBox, etc.)
apenas quando no for possvel trabalhar com controles HTML Tutorial
puro. Assim, se voc precisa exibir dados de forma dinmica, que
dependem de informaes que esto localizadas em um banco
de dados, por exemplo, esperado e at conveniente que utilize AJAX Control Toolkit
os server controls. J em casos de dados estticos como textos Para comear a usar esta biblioteca necessrio fazer o seu
explicativos, ttulos, etc., o ideal usar os controles HTML para download no site do projeto (vide seo Links) e descompactar o
acelerar a carga da sua pgina. contedo do arquivo em uma pasta.
Com a aba criada, devemos agora adicionar os componentes Figura 3. Toolbox AJAX Toolkit
clicando com o boto direito do mouse sobre a tab recm-criada
e escolhendo a opo Choose Items. O funcionamento deste toolkit e dos seus controles consiste basi-
O processo continua navegando pelo sistema de arquivos do camente na gerao do script necessrio para gerenciar requisies
seu computador para localizar a pasta onde foi descompactado o e respostas do servidor pelo lado do cliente. Para que isto seja feito
arquivo com os componentes. Isto feito clicando no boto Browse corretamente o primeiro elemento que deve estar presente na
da aba .NET Framework Components que vai exibir uma janela pgina o ToolKitScriptManager, responsvel pelo gerenciamento
para pesquisar pastas e arquivos do Windows. Nesta devemos destas requisies. Este componente no visual bem simples de
localizar o arquivo AjaxControlToolkit.dll, selecionar o mesmo trabalhar, precisando apenas ser arrastado. S a sua presena j
e clicar em OK. garante o correto funcionamento dos controles.
Com o arquivo da biblioteca selecionado o Visual Studio retorna Com relao performance do AJAX existem algumas restries.
para a janela j com os controles AJAX selecionados, como mos- Como foi considerado no tpico sobre o ASP.NET, o cdigo dos com-
trado na Figura 2. Clicando em OK o processo concludo. ponentes AJAX gerado no servidor. Se houverem muitos componen-
tes a tendncia que a carga inicial da pgina fique muito lenta.
Desta forma, preciso usar os controles com critrio. Este critrio
difcil porque cada projeto tem suas caractersticas particulares.
Uma boa dica usar componentes desta biblioteca apenas onde
o tempo de resposta for algo muito importante para o correto
funcionamento, como por exemplo, controles de calendrio ou
de formatao dinmica.
Query String
Na primeira parte do artigo fizemos a transferncia de dados
entre as pginas usando as variveis de sesso (Sessions) do ASP
.NET. Nesta parte veremos um pouco mais sobre como fazer esta
transferncia usando outro recurso chamado de QueryString.
Consiste em colocar o nome da varivel e o valor no campo de
endereo do browser, logo aps a URL da pgina, precedido pelo
ponto de interrogao da seguinte forma:
Para ler corretamente estes valores, no seu cdigo em C# escreva Porm, existem situaes em que isso pode ser insuficiente para
um manipulador para o evento Load da pgina (ou onde achar modelar os dados e a regra de negcios da aplicao.
conveniente) como no exemplo da Listagem 1. Se voc procurar na solution vai encontrar o cdigo que define
as classes do Entity Framework. E cada entidade est definida
desta forma:
Listagem 1. Obtendo parmetros a partir da QueryString
http://minhaaplicacao.com/Customer.aspx?Delete=true&ID=COMMI
If(Request.QueryString[0] != null)
...
Figura 4. Visualizando o cdigo do Data Model
Voc pode tambm achar conveniente obter o nome de todas as
chaves que foram passadas, evitando erros de programao ao
acessar um item que no existe. Para obter todas as chaves que Folhas de Estilo CSS
foram passadas use a propriedade AllKeys desta forma: ASP.NET compatvel com folhas de estilo em cascata (CSS)
o que significa que voc pode (na verdade, deve) definir estilos
var obj = Request.QueryString.AllKeys;
previamente para que sejam usados em todo o projeto e garantam
Esta propriedade retorna um array de string com todos os nomes a uniformidade de formatao de suas pginas.
que foram passados. A principal vantagem ao utilizar este recurso que diminui a
complexidade do cdigo HTML usado para carregar a pgina. Em
Entity Framework e Partial Classes vez de definir os estilos e formatao em cada elemento e server
Continuando com os recursos que foram apresentados na pri- control da pgina, associam-se estes a um estilo css.
meira parte do artigo, ao usarmos Entity Framework para fazer o Dessa forma, alm da carga da pgina ser realizada mais rapi-
mapeamento dos dados, foi feito apenas o trabalho bsico de criar damente, uma vez que o contedo HTML fica mais limpo, para o
as classes correspondentes s tabelas no banco de dados. desenvolvedor fica mais fcil fazer qualquer manuteno, pois ao
01 body
02 {
03 font-family:Verdana,Arial,Helvetica,sans-serif;
04 font-size:12px;
05 margin-top:0;
06 margin-bottom:0;
07 margin-left:0;
08 margin-right:0;
09 width:100%;
10 }
01 .command
02 {
03 border:2pxoutset#000099;
04 padding:8px;
05 font-family:Arial,Helvetica,sans-serif;
06 font-size:small;
07 color:#FFFFFF;
08 background-color:#0039FF;
09 }
Figura 6. Janela do assistente para construo de estilo
Esta pgina tem os componentes da Tabela 1 onde voc pode Listagem 7. Carga da pgina
conferir as configuraes das principais propriedades. Nas proprie-
01 using System;
dades j esto sendo colocadas as classes CSS que sero usadas. 02 using System.Configuration;
O bloco que inicia com a tag <asp:GridView> na linha 37, re- 03 using System.Linq;
ferente grid completa. Dentro deste esto aninhados os blocos 04 using System.Web.UI;
05
referentes ao estilo do cabealho na linha 42, referente ao estilo 06 namespace BlogEngine.pages
das linhas (linha 43) e referente s linhas alternadas (linha 44). 07 {
A partir da linha 45 inicia-se a definio das colunas que estaro 08 public partial class blog : System.Web.UI.Page
09 {
vinculadas com as propriedades da classe Blog. 10 protected void Page_Load(object sender, EventArgs e)
Um ponto importante na definio da coluna que vai mostrar a 11 {
12 if (Page.IsPostBack)
data o elemento HtmlEncode (na linha 54) definido como false
13 return;
para que a string de formatao (linha 52) possa ser aplicada ao 14
campo. Caso esta propriedade no seja definida, a string no 15 if (Request.QueryString.Count == 0)
16 {
tem efeito.
17 Response.Redirect(../default.aspx);
Esta pgina uma das mais dinmicas da aplicao. Todo 18 return;
o seu contedo construdo durante a execuo partindo do 19 }
20
contedo do banco de dados. Assim, o primeiro cdigo a ser 21 load();
escrito corresponde ao evento Page_load (executado sempre que 22 }
feita uma chamada para a pgina) e que pode ser conferido na
Listagem 7.
O mtodo verifica se a pgina est sendo recarregada em Neste caso fazemos o direcionamento para a pgina default, mas
resposta a uma solicitao; em seguida verifica se foi passado em uma situao de real vai ser necessrio usar outra pgina com
algum parmetro na string do endereo usando QueryString e uma mensagem mais significativa para o usurio de forma que
faz chamada ao mtodo load para fazer a carga. deixe claro que houve algum problema com a carga da pgina.
Na linha 15 o cdigo verifica o nmero de parmetros Query- Podemos ver o mtodo load que faz a carga dos dados na
String que foi enviado, caso por algum motivo nenhum parmetro Listagem 8.
tenha sido enviado, a pgina redirecionada para a pgina default O mtodo load chama outro mtodo na linha 03 responsvel pela
da aplicao e o mtodo encerra. carga dos dados enviando como parmetro deste o valor passado
lista, como neste caso colocamos a lista em ordem descendente, Na Tabela 2 segue a configurao das propriedades dos controles
vo ser retornadas as ltimas <n>. que esto nesta pgina. Note que na tabela j esto includas as
classes CSS que sero usadas.
Pgina para exibio das publicaes A parte principal desta pgina est na sua carga. Novamente
Para exibir o contedo de um post foi adicionada uma pgina obtido o id do post que deve carregar atravs da QueryString.
nomeada como posts.aspx. O design bsico da pgina, ainda sem O evento responsvel pelo preenchimento dos dados o Page_
o estilo aplicado, pode ser conferido na Figura 10. Load cujo mtodo pode ser conferido na Listagem 12.
Esta pgina tem a marcao HTML como da Listagem 11.
Voc at pode optar por criar uma folha apenas para o projeto, no comeo, mas faa o bsico no incio e v aos poucos sofisticando.
mas, isto provavelmente vai dificultar a manuteno e em alguns A Listagem 15 mostra o contedo do arquivo base.css. A Tabela 3
casos, impossvel porque existiro situaes em que um estilo no contm os comentrios para cada elemento.
vai conseguir sobrepor a outro. Na Listagem 16 esto as classes da folha de estilo para a edio
O ponto importante as folhas de estilo que voc possa ter em do post. Novamente, para verificar o que cada classe faz, consulte
mente antes um padro para ser seguido em todo o projeto. difcil a Tabela 4.
01 body 62 background-color:#D2E9FF;
02 { 63 }
03 font-family:Verdana,Arial,Helvetica,sans-serif; 64 .command
04 font-size:12px; 65 {
05 margin-top:0; 66 border:2pxoutset#000099;
06 margin-bottom:0; 67 padding:8px;
07 margin-left:0; 68 font-family:Arial,Helvetica,sans-serif;
08 margin-right:0; 69 font-size:small;
09 width:100%; 70 color:#FFFFFF;
10 } 71 background-color:#0039FF;
11 h1 72 }
12 { 73 .command:hover
13 font-family:Verdana,Arial,Sans-Serif; 74 {
14 background-color:#003399; 75 border-color:#003300;
15 color:#FFFFFF; 76 background-color:#329900;
16 font-size:24pt; 77 }
17 width:100%; 78 .error
18 height:40px; 79 {
19 vertical-align:middle; 80 color:red;
20 margin-top:0; 81 }
21 margin-bottom:0; 82 a
22 margin-left:0; 83 {
23 margin-right:0; 84 color:#0039FF;
24 font-weight:normal; 85 text-decoration:none;
25 } 86 }
26 .title 87 a:hover
27 { 88 {
28 background-color:#003399; 89 background-color:#D2E9FF;
29 color:#FFFFFF; 90 }
30 margin-top:0; 91 .aplus
31 margin-bottom:0; 92 {
32 margin-left:0; 93 color:White;
33 margin-right:0; 94 background-color:transparent;
34 width:100%; 95 text-decoration:underline;
35 vertical-align:middle; 96 }
36 } 97 .aplus:hover
37 .form 98 {
38 { 99 text-decoration:underline;
39 margin-top:15px; 100 background-color:Blue;
40 margin-bottom:0; 101 }
41 margin-left:15px; 102 .TextArea
42 margin-right:0; 103 {
43 width:90%; 104 border-width:1px;
44 } 105 border-color:#4C4C4C;
45 .field 106 font-family:LucidaConsole,Monospace;
46 { 107 font-size:10pt;
47 border-style:nonenonesolidnone; 108 font-weight:bold;
48 border-width:1px; 109 margin:0000;
49 border-color:#4C4C4C; 110 overflow:auto;
50 font-family:LucidaConsole,Monospace; 111 }
51 font-size:10pt; 112 .TextArea:focus
52 height:20px; 113 {
53 font-weight:bold; 114 background-color:#D2E9FF;
54 margin:0000; 115 }
55 } 116 .content
56 .field:hover 117 {
57 { 118 font-family:SegoeUI,Arial,Sans-Serif;
58 background-color:#D2E9FF; 119 font-size:10pt;
59 } 120 margin-right:20px;
60 .field:focus 121 margin-left:20px;
61 { 122 }
o entendimento do cdigo, enquanto que os itens adicionados GridAlternate Formatao para linhas alternadas das linhas da grid.
ficaro destacados, de forma que a leitura no fique poluda. GridTitle Formatao para o ttulo da grid.
A primeira pgina que vai ser modificada a pgina de login. Sobrepe a TAG <table> definindo a formatao
Table
Sua aparncia final ser como exibido na Figura 12. Note que bsica deste elemento.
o campo da senha est recebendo o foco e com isso j teve sua Vai definir a formatao para coluna esquerda de uma
TableLeft
aparncia alterada. tabela.
TableRight Define formatao de coluna direita de uma tabela.
Listagem 17. Folha de estilos para grid TableHeader Formatao do cabealho de tabela.
TableBlogLeft e Formatao de coluna para a pgina dos posts do
01 .GridBase TableBlogRight blog.
02 {
03 font-family:SegoeUI,Arial,Sans-serif; Tabela 5. Folha de estilos de listagens
04 border:1pxsolid#CCCCCC;
05 }
06 .GridAlternate
07 { As principais mudanas do cdigo HTML esto em destaque
08 background-color:#DBE1F9; na Listagem 18 que mostra tambm as classes CSS que foram
09 }
10 .GridTitle
vinculadas com os controles e as mudanas no HTML.
11 { Na Listagem 18 gostaria de destacar na linha 3 o cdigo que
12 color:White; faz a ligao da folha de estilo CSS com a pgina. Ainda na
13 background-color:#003399;
14 } Listagem 18, na linha 6, podemos ver que inclumos uma tag
15 table{width:100%;} <div>, usada para criar a parte do cabealho da pgina, melho-
16 .TableLeft rando a aparncia da pgina.
17 {
18 width:50%;
19 vertical-align:text-top;
20 } Listagem 18. Marcao HTML para a pgina inicial
21 .TableRight
22 { 01 <headrunat=server>
23 vertical-align:text-top; 02
24 } 03 <linkhref=~/css/base.cssrel=stylesheettype=text/css/>
25 .TableHeader 04 </head>
26 { 05 <body>
27 font-size:18pt; 06 <divclass=title>
28 } 07 <h1>BlogEngine-GerenciadordeBlogs</h1>
29 .TableBlogLeft 08 <br/>
30 { 09 </div>
31 width:70%; 10 <formid=form1
32 vertical-align:text-top; 11
33 } 12 class=form>
34 .TableBlogRight 13 <asp:TextBox
35 { 14
36 vertical-align:text-top; 15 ID=txtEmail
37 } 16 CssClass=field
17 /><br/>
18 <asp:RequiredFieldValidator
19 20 ID=LoginRequiredFieldValidator
21 CssClass=error/><br/>
22 <asp:TextBox
23
24 ID=txtPass
25 CssClass=field/><br/>
26 <asp:RequiredFieldValidator
27 ID=PassRequiredFieldValidator
28
29 CssClass=error/><br/>
30 <asp:Button
31 ID=btnSend
32
33 CssClass=command />
34 </form>
35 </body>
Figura 12. Pgina inicial Layout Final
Na pgina para edio do post foi colocado um ToolkitScript- seja, se estiver usando o designer do Visual Studio em vez da
Manager (linha 40) logo aps a marcao Form. marcao HTML para editar a pgina este elemento vai ficar com
Este elemento no precisa ter nenhuma propriedade ajustada, a aparncia da Figura 16. O controle para a mscara dos campos
sendo assim, basta arrast-lo para a pgina ou definir sua mar- TextBox tambm no possui visualizao em tempo de design.
cao HTML. Lembrando que este um controle no visual, ou O controle que vai gerar a mscara para o controle TextBox o Text-
BoxWatermarkExtender. Inserimos ele nas linhas 43, 61, 72 e 85.
Alm do ID, as propriedades mais importantes deste con-
trole so:
WatermarkCssClass vincula o controle com uma classe CSS.
Pode ou no estar presente.
WatermarkText propriedade para configurar o texto que vai
ser usado como mscara para o controle.
TargetControlID ID do controle que est vinculado com o
componente.
01 <headrunat=server> 30 <br/>
02 ... 31 <asp:label
03 <linkhref=~/css/grid.cssrel=stylesheettype=text/css/> 32 runat=server
04 <linkhref=~/css/base.cssrel=stylesheettype=text/css/> 33 ID=lblPostText/>
05 </head> 34 <br/><br/>
06 <body> 35 <divclass=TableHeader>PostsRecentes</div>
07 <formid=form1 36 <asp:GridView
08 runat=server> 37 runat=server
09 <divclass=title> 38 ID=grdPosts
10 <h1><asp:Label 39 CssClass=GridBase
11 ... 40 AutoGenerateColumns=false>
12 ID=lblTitle/></h1> 41 <HeaderStyleCssClass=GridBaseGridTitle/>
13 <br/> 42 <RowStyleCssClass=GridBase/>
14 </div> 43 <AlternatingRowStyleCssClass=GridBaseGridAlternate/>
15 <tablestyle=width:100% 44 <Columns>
16 45
17 class=form> 46 </Columns>
18 <tr> 47 </asp:GridView>
19 <tdclass=TableBlogLeft> 48 </td>
20 <asp:Label 49 <tdclass=TableBlogRight>
21 50 <divclass=TableHeader>DetalhesdoBlog</div>
22 CssClass=TableHeader 51
23 ID=lblDescription/> 52 </td>
24 <br/> 53 </tr>
25 <h3> 54 </table>
26 <asp:HyperLink 55 </form>
27 56 </body>
28 ID=hypLastPostTitle 57 </html>
29 CssClass=TableHeader/></h3>
Finalizando o projeto, temos na Figura 18 o design final da Listagem 23. Marcao HTML da visualizao de post
pgina que exibe o post.
Na Listagem 23 voc pode conferir como ficou a marcao <headrunat=server>
<linkhref=~/css/base.cssrel=stylesheettype=text/css/>
HTML para a pgina com destaque para os elementos CSS. <linkhref=~/css/grid.cssrel=stylesheettype=text/css/>
</head>
<body>
<formid=form1
runat=server>
<divclass=title>
<h1>
<asp:Label
runat=server
ID=lblBlogTitle
Text=Nomedoblog/></h1>
<br/>
<asp:HyperLink
runat=server
Text=Pginainicial
CssClass=aplus
ID=hypHome/><br/><br/>
</div>
<br/>
<asp:Label
Figura 17. Viso da pgina inicial do blo runat=server
Text=TtulodoPost
CssClass=formTableHeader
ID=lblTitle/><br/><br/>
<divclass=form>
<asp:Label
runat=server
ID=lblContent
Text=content/></div>
</form>
</body>
</html>
Figura 18. Visualizao de post
Vladimir Rech How to generate key pairs, encrypt and decrypt data with .NET (C#)
vladimirrech@yahoo.com.br http://vladimirrech.blogspot.com - http://blogs.msdn.com/b/alejacma/archive/2008/10/23/how-to-generate-key-
@vladimirrech pairs-encrypt-and-decrypt-data-with-net-c.aspx
Tecnlogo em Desenvolvimento de Sistemas pelo CEFET/UTF-PR,
Encrypt and Decrypt Data with C#
trabalha com desenvolvimento de sistemas em .NET destacando-se apli-
caes Windows, ASP.NET e Webservices. Mantm um blog onde escreve http://www.codeproject.com/Articles/14150/Encrypt-and-Decrypt-Data-with-C
sobre diversos assuntos relacionados a programao e ao Framework .NET. Encrypt/Decrypt String using DES in C#
http://www.codeproject.com/Articles/19538/Encrypt-Decrypt-String-using-DES-in-C
Color Wizard
http://www.colorsontheweb.com/colorwizard.asp
ASP.NET Params Collection vs. QueryString, Forms vs. Request[index]
and Double Decoding
http://www.hanselman.com/blog/
ASPNETParamsCollectionVsQueryStringFormsVsRequestindexAndDoubleDecoding.aspx
Utilizando CSS no Asp.Net
http://www.devmedia.com.br/utilizando-css-no-asp-net/5113
JavaScript e CSS
http://www.devmedia.com.br/artigo-net-magazine-66-javascript-e-css/14417
Utilizando CSS no Asp.Net
http://www.devmedia.com.br/utilizando-css-no-asp-net/5113
Envie dados via QueryString com mais segurana
http://www.devmedia.com.br/envie-dados-via-querystring-com-mais-
seguranca/4559