ASP.NET - Melhorando o cache de GridViews

A aplicação do @outputCache nas páginas melhora consideravelmente o desempenho do site, fazendo uso de cache de saída.

O @outputcache é bem versátil, podemos determinar os parâmetros que farão com que a página tenha que ser re-processada ou não. Com inúmeros postbacks na página, podemos então configurar o @outputcache corretamente para que o cache seja feito sem prejudicar as funcionalidades.

A forma meio preguiçosa de fazer o @outputcache é determinando a variação por tudo:

<%@outputcache duration="60" varybyparam="*" %>

Desta forma temos um consumo de recursos muito grande. Além disso, alguns objetos, como a gridView, não são otimizados para uma variação como essa, especialmente porque esta variação leva em consideração o viewstate.

A gridview guarda no viewstate informações atuais como por exemplo a página atual. Assim se navegar da página 2 para a 3 o viewstate é um, mas se navegar da 5 para a 3 o viewstate é outro. O cache poderia ser feito, mas não é feito por causa do viewstate.

Para evitar isso podemos indicar parâmetros específicos no varybyparam, veja:

<%@outputcache duration="60" varybyparam="__EVENTTARGET;__EVENTARGUMENT" %>

Isso já melhora a aplicação de cache, mas vai considerar apenas esses dois parâmetros para a aplicação de cache. Se houverem mais objetos na página ou se a gridview estiver permitindo edição, teremos problemas. Seria complicado indicar no varybyparam todos os campos possíveis, um por um, especialmente se a gridview estiver permitindo edição.

Assim o ideal seria fazermos o contrário: excluir do processamento do cache os campos indesejáveis, que são 2: ViewState e EventValidation.

Para fazer isso podemos utilizar o varybycustom. Com o varybycustom podemos codificar no global.asax a geração da informação pela qual o cache será verificado (processa ou não?). Veja :

<%@outputcache duration="60" varybyparam="none" varybycustom="grid" %>

Public Overrides Function GetVaryByCustomString(ByVal context As System.Web.HttpContext, ByVal custom As String) As String

If custom = "grid" Then
Dim s As String
Dim resultado As String
For Each s In context.Request.Form
If UCase(s).IndexOf("VIEWSTATE") = -1 And UCase(s).IndexOf("EVENTVALIDATION") = -1 Then
resultado &= Request.Form(s)
End If
Next
Return (resultado)
End If
End
Function

Neste exemplo o ASP.NET vai consultar o getVaryByCustomString e nós estamos devolvendo a concatenação de todos os parâmetros, exceto os 2 indesejáveis.

Desta forma o processamento do cache será mais otimizado, sendo processamento realmente apenas quando necessário.