Caching em ASP.NET
Caching em ASP.NET
Aplicações web podem ter de atender centanas de milhares de usuários, e temos que usar todos os recursos disponíveis para mante-la rodando com uma boa performance.
Normalmente alguns recursos são exibidos a diferentes usuários sem sequer que tenha havido tempo para estas informações serem alteradas. De qualquer forma, se nada for feito, a cada acesso a aplicação vai novamente buscar essas informações onde quer elas estejam. Para citar um exemplo, se seu aplicativo em uma pagina de cadastro exibe uma relação de cidades em um ComboBox para que o usuário faça a escolha de uma. A cada novo usuário sua aplicação vai abrir uma conexão com o banco de dados, executar a consulta e preencher o ComboBox. Qual o custo desta tarefa para sua aplicação? Qual a probabilidade da relação de cidades mudar nas proximas horas?
O ASP.NET nos oferece diversos recusos de armazenamento em cache, vamos estada-los a seguir.
Output Caching
A adicão de uma diretiva de compilação em uma página ASP.NET já vai colocar a página em cache. Para fazer um teste, coloque a diretiva a seguir logo abaixo da diretiva @Page:
| <%@ OutputCache Duration="30" VaryByParam="None" %> |
Coloque um label em sua página e no evento Load digite o código abaixo:
| Label1.Text = DateTime.Now.ToString |

| Label1.Text = DateTime.Now.ToString(); |
Rode a aplicação. Observe a hora exibida. Pare a aplicação e rode novamente ou simplismente atualize a página. Veja que a hora continua a mesma, sem atualização.
Aguarde em torno de 30 segudos, que foi o tempo de duração informado na diretiva e rode a aplicação novamente. Observe que a hora é atualizada.
Variação por Parametros
O atributo VaryByParam, utilizado no exemplo anterior nos permite criar versões diferentes para variações de determinado parâmetro na Query String da aplicação.
Para exemplificar, no exemplo anterior altera a diretiva da seguinte maneira:
| <%@ OutputCache Duration="30" VaryByParam="Codigo" %> |
Rode a aplicação e adicione a ?Codigo=1 ao final da Url, como no exemplo abaixo:

Memorize a hora, altere o código para 2 e tecle Enter. Note que hora mudou. Volte o valor do parâmetro para 1 e tecle Enter. Note que é exibido a hora anterior, ou seja, que estava armazenada em cachê.
“Você pode especificar o armazenamento por mais de um parâmetro, bastando para isso informa-los separados por ”;”. O armazenamento se dará sempre pela combinação de todos os parâmetros, ou seja, sempre que surgir uma nova combinação de valores, um novo armazenamento será gerado. Para que seja aplicado cache a todos os parâmetros, basta informaR “*”.
Praticando
Crie uma aplicação ASP.NET em que o usuário escolhe o signo em uma página inicial. Este valor informado é passado como parâmetro para a segunda pagina, onde o valor é recebido pela Query String e a previsão é exibida de acordo com o signo, informando ainda a hora em que a informação foi gerada. As previsões devem ser armazenadas em cache por pelo menos 10 minutos.
VaryByControl
Através do atributo VaryByControl, podemos definir que determinado controle da página seja armazenado em cachê, bastando para tanto informar o nome do mesmo:
| <%@ OutputCache Duration="30" VaryBycontrol="Label1" %> |
O uso de VaryByControl é ideal para o armazenamento de User Controls.
Substitution
As vezes queremos manter em cache a página inteira, porem determinada informação precisa ser dinâmica e variar de usuário pra o usuário ou mesmo em função do tempo. Um bom exemplo é exibir a hora atualizada pro usuário, ou mesmo seu nome de login.
O ASP.NET disponibiliza para isso um controle Subtituton, que recebe na sua propriedade MetodName o nome de um método que será dinâmico, ou seja, não será armazenado em cache. Este método deve deve ser shared /static e receber como parâmetro um tipo HttpContext.
Adaptar o nosso primeiro exemplo, em que exibimos a data e hora em label, para ter uma porção da página exibindo a hora sem armazendo em cache, utilizando um Substitution, é facil. Primeiramente adicione a seguinte função a página:
Public Shared Function RetornaHora(ByVal context As HttpContext) _ As String Return DateTime.Now.ToString()
End Function |

public static string RetornaHora(HttpContext context) {
return DateTime.Now.ToString(); } |
Em seguida acione um controle Subtitutio e denina sua propriedade MethodName como RetornaHora.
Rode a aplicação. Atualize a página algumas vezes e note que o Label colocado anteriormente mantem fixo o valor da hora enquato o cache não espira. Já o controle Substitution renderiza a data e hora atualizados.

Programando cache manualmente
Para poder aproveitar o Maximo da funcionalidade de cache, você pode programar a sua utilização. O funcionamento básico é semelhante ao de variáveis de sessão e aplicação, basta ler ou gravar o valor através de um identificador único:
| Cache("Nome") = "Fernando" |

| Cache["Nome"] = "Fernando"; |
Outra maneira de utilizar cache é usando o método Insert. O primeiro parâmetro é o identificador, o segundo é o abjeto a ser armazenado:
| Cache.Insert("Nome", "Fernando") |

| Cache.Insert("Nome", "Fernando"); |
O método Insert possui ainda algumas sobrecargas, que permitem criar dependências, ou determinar o tempo de expiração do cache. O tempo de expiração pode ser absoluto, onde você deve informar a hora exata em que o cache vai expirar, ou sliding, em que você informa o tempo de expiração a partir da criação do cache. O exemplo abaixo coloca um string em cache por 20 segundos:
| Cache.Insert("Nome", "Fernando", Nothing, DateTime.MaxValue,_ TimeSpan.FromSeconds(20)) |

| Cache.Insert("Nome","Fernando", null, DateTime.MaxValue, TimeSpan.FromSeconds(20)); |
Praticando
Refaça a tarefa anterior, porém desta vez armazenando as informações dos signos em um banco de dados. No programa, coloque as informações manualmente em um cache, mantendo por 10 minutos.