quinta-feira, 22 de maio de 2008

Gerenciamento de estado do ASP.NET

Sabemos que o protocolo HTTP é um protocolo sem estado(Stateless), ou seja, cada requisição feita ao servidor é vista como uma transação independente que não tem relação com requisições anteriores. Então, as aplicações web, que utilizam o protocolo HTTP, não poderiam fornecer conteúdos específicos para um usuário? Depois de entrar num site com usuário e senha, uma segunda requisição não poderia mostrar informações específicas de um usuário? Por isso é necessário utilizar de métodos alternativos para manter estado e iremos pode ser feito no ASP.NET.

O estado do ASP.NET poderia ser definido como uma foto de um determinado momento da utilização da aplicação web pelo usuário. Poderia estar incluído nesta foto diversas informações, como qual usuário que está usando, dados digitados em controles e várias outras. Esta foto poderia incluir inclusive dados que o usuário enviou a vários dias. Para possibilitar esta manutenção de estado, existem alguns recursos:

Recursos para manutenção de estado em cliente:

  • View State(Estado da exibição)

  • Control State(Estado de controle)

  • Campos ocultos

  • Cookies

  • Query Strings(String de consulta da url)

  • Armazenamento de sessão no Cliente(Client side storage)

Recursos para manutenção de estado no servidor:

  • Application State (Estado do Aplicativo)

  • Session State (Estado da sessão)

  • Propriedades de Perfil

Abaixo iremos explicar um pouco de cada um destes recursos.

Recursos para manutenção de estado em cliente:

View State(Estado da exibição)

A página e controles usam por padrão o view state para armazenar seus dados, o ViewState é uma tabela hash onde possui uma chave e um valor, que é o valor do estado armazenado para aquela chave. Esta tabela hash é serializada na codificação base 64 e armazenada em cliente num campo oculto(o elemento input com atributo type=”hidden”). É possível que o usuário desabilite o ViewState de controles ou até mesmo armazene valores próprios, mas é importante ressaltar que como estes dados vão para cliente, deve-se tomar o cuidado com o que é armazenado.

Para exemplificar, podemos pensar que um controle pode por exemplo armazenar informação sobre sua visibilidade no view state, e se por ventura deixar de ficar visível, isto poderia ser atualizado no ViewState.

Control State(Estado de controle)

O Control State trabalha da mesma forma que o View State, só que o View State pode ser desabilitado e o Control State, dessa forma o Control State tem as informações de estado do controle indispensáveis para seu correto funcionamento. O ASP.NET utiliza isto para seus controles e podemos também fazê-lo para nossos controles.

Campos ocultos

O campo oculto(o elemento input com atributo type=”hidden”) permite enviar e recuperar informações no HTML como os demais controles de formulário, só que não renderiza nada para o usuário. Mas apesar de de não mostrar nada para os usuários, usuário mal intencionados podem alterar ou recuperar valores destes campos, por isso deve-se tomar cuidado com os dados que são armazenados desta forma.

Cookies

Um cookie são dados que podem ser armazenados como arquivo de texto no sistema de arquivo do cliente ou na memória da sessão do navegador do cliente. Ele contêm informações específicas do site, que o servidor envia para o cliente através da resposta da requisição da página.

Os cookies podem ser usados para armazenar informações de um cliente em particular, sessão ou aplicação. Os cookies podem ser armazenados no dispositivo cliente, e o navegador envia estes para o servidor juntamente com as informações de requisição. Desta forma estas informações ficam disponíveis para serem utilizadas no servidor.

Como os dados do cookie ficam disponíveis no cliente, usuário mal intencionados podem ter visualizar ou até mesmo modificar estas informações.

Query Strings(String de consulta da url)

A url para requisição de um recurso do servidor pode conter informações extras, como é o caso da Query String. A QueryString inicia após um ponto de interrogação(?) e é formada por um conjunto de pares chave/valor, onde cada par é separado pelo "&". Vejamos um exemplo:

http://www.google.com.br/search?q=aplicacoesweb.blogspot.com

Neste exemplo acima, que funciona se utilizado no navegador, é passado para o mecanismo de busca a querystring q=aplicacoesweb.blogspot.com. Esta querystring contêm um único par que é a chave "q" e o valor "aplicacoesweb.blogspot.com".

Apesar de ser simples a forma de passar informações por Query String, mas alguns navegadores impõe limitações da quantidade de caracteres na URL.

As informações de querystring também podem ser utilizadas e alteradas por usuários mal intencionados.

Armazenamento de sessão no Cliente(Client side storage)

Esta é uma novidade do HTML 5, que alguns navegadores já implementam, o client side storage. Sua idéia é muito parecida com o cookie, mas este vem como solução para dois problemas na utilização de Cookie:

  • Ter dados disponíveis de forma única para janelas diferentes

Hoje é muito o comportamento de navegadores com várias guias, caso do Firefox 2 e Internet Explorer 7. Se logarmos em um site e abrirmos outra guia, esta outra guia possui a mesma sessão da primeira, pois ambos estão no mesmo processo, na mesma instância do navegador. Já se abrirmos outro navegador, outro processo, estes não compartilham a sessão. O cookie não manipula bem estes casos

  • Armazenar uma grande quantidade de dados no cliente

Os cookies são sempre enviados para o servidor a cada requisição, então é inviável armazenar uma grande quantidade de dados no cliente.

Atualmente o HTML 5 tem o seu rascunho de implementação, de acordo com o existente da data de 22 de maio de 2008 haverão dois novos atributos DOM, o sessionStorage e o localStorage para resolver esta demanda.

Recursos para manutenção de estado no servidor:

Application State (Estado do Aplicativo)

O ASP.NET permite que informações da aplicação Web sejam salvas no Application State, que é uma instância da classe HttpApplicationState. Estas informações são únicas para todos usuário de uma aplicação Web em específico, mas não é compartilhada entre aplicações Webs. Estas informações são salvas numa tabela de chave/valor.

Session State (Estado da sessão)

o ASP.NET permite que seja armazenado valores de uma sessão usando o Session State, que é uma instância da classe HttpSessionState. Session state é similar ao Application state, armazenando os valores também numa tabela de chave/valor, mas neste caso as informações são únicas para cada sessão do navegador.

Se um usuário sai da aplicação, por exemplo fechando um navegador, e posteriormente retorna ao site, não terá a mesma sessão e não estará disponível no Session State informações da sessão anterior.

O Session State pode ser configurado para armazenar as informações da sessão em banco de dados e de várias outras formas. Por padrão as informações de sessão são armazenadas por um tempo, se o usuário ficar pelo tempo determinado sem fazer requisições ao servidor, será considerado inativo e os dados de sua sessão serão limpos. Este tempo de expiração padrão é 20 minutos.

Propriedades de Perfil

O ASP.NET disponibiliza uma funcionalidade chamada propriedade do perfil(Profile Properties), que permite o armazenamento de dados específicos do usuário. Este é similar a sessão, mas os dados não são perdidos quando a sessão expira.

O perfil ASP.NET permite uma fácil manutenção das informações do usuário, utilizando provedores de perfil(Profile providers). Esta arquitetura de provedores permite uma fácil utilização de provedores existentes, como é o caso do SqlProfileProvider, ou a criação de provedores próprios. Utilizando de provedores persistentes como é o caso do SqlProfileProvider, os dados estarão disponíveis para o usuários numa arquitetura de WebFarm ou mesmo que o IIS reinicie.

Referências:
http://msdn.microsoft.com/pt-br/library/75x4ha6s.aspx
http://msdn.microsoft.com/pt-br/library/bb386448.aspx
http://aplicacoesweb.blogspot.com/2008/04/html-5-como-est-indo.html
http://www.whatwg.org/specs/web-apps/current-work/#structured
http://technet2.microsoft.com/windowsserver/en/library/51aa77d2-4485-4cb9-a75f-9186dc5d775f1033.mspx?mfr=true
http://msdn.microsoft.com/pt-br/library/2y3fs9xs.aspx
http://msdn.microsoft.com/en-us/library/ewfkf772.aspx
http://en.wikipedia.org/wiki/Program_state
http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol