Antes de iniciarmos esse artigo, irei explicar de forma rápida o que seria um
ViewState.
"A grosso modo",
ViewState é uma string que armazena informações sobre o estado da página em um campo oculto dentro da mesma.
Bom, acho que agora já podemos iniciar este artigo! :-)
Geralmente quanto maior a complexibilidade de uma página, maior será as informações armazenadas em seu
ViewState. Chegando a um ponto em que o
ViewState prejudica o carregamento de nossa página.
Antes a solução seria eliminar o
ViewState, mas agora poderemos partir para outra solução.
Ao usarmos a
lib GZipStream podemos compactar o viewstate e com isso reduzir em 45% o tamanho do
ViewState.
Veremos a partir de agora como compactar e descompactar dados na memória.
Nossa Classe de compactação usará
System.IO.Compression e
System.IO;
Criaremos em nossa classe dois metodos estáticos:
public static byte[] CompactarViewState(byte[] bytes)
e
public static byte[] DescompactarViewState(byte[] bytes)
Para realmente compactarmos nosso
ViewState, teremos que dar um override nos seguintes métodos em seu WEBFORM:
LoadPageStateFromPersistenceMedium e
SavePageStateToPersistenceMediumNossa classe de compactação ficará assim:
public class ClassCompactarViewState
{
public ClassCompactarViewState()
{
//
// TODO: Add constructor logic here
//
}
public static byte[] CompactarViewState(byte[] bytes)
{
MemoryStream MSsaida = new MemoryStream();
GZipStream gzip = new GZipStream(MSsaida, CompressionMode.Compress, true);
gzip.Write(bytes, 0, bytes.Length);
gzip.Close();
return MSsaida.ToArray();
}
public static byte[] DescompactarViewState(byte[] bytes)
{
MemoryStream MSentrada = new MemoryStream();
MSentrada.Write(bytes, 0, bytes.Length);
MSentrada.Position = 0;
GZipStream gzip = new GZipStream(MSentrada,
CompressionMode.Decompress, true);
MemoryStream MSsaida = new MemoryStream();
byte[] buffer = new byte[64];
int leitura = -1;
leitura = gzip.Read(buffer, 0, buffer.Length);
while (leitura > 0)
{
MSsaida.Write(buffer, 0, leitura);
leitura = gzip.Read(buffer, 0, buffer.Length);
}
gzip.Close();
return MSsaida.ToArray();
}
}
WebForm.aspxAbaixo de seu
Page_Load adicione o código abaixo:
protected override object LoadPageStateFromPersistenceMedium()
{
string viewState = Request.Form["__VSTATE"];
byte[] bytes = Convert.FromBase64String(viewState);
// DESCOMPACTAR VIEWSTATE
bytes = ClassCompactarViewState.DescompactarViewState(bytes);
LosFormatter formatter = new LosFormatter();
return formatter.Deserialize(Convert.ToBase64String(bytes));
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
LosFormatter formatter = new LosFormatter();
StringWriter writer = new StringWriter();
formatter.Serialize(writer, viewState);
string viewStateString = writer.ToString();
byte[] bytes = Convert.FromBase64String(viewStateString);
// COMPACTAR VIEWSTATE
bytes = ClassCompactarViewState.CompactarViewState(bytes);
ClientScript.RegisterHiddenField("__VSTATE", Convert.ToBase64String(bytes));
}
Ao testar essa classe em uma página que gera pouca informação no
ViewState, não será notado nenhuma diferença, mas caso seja alocado em uma página mais complexa a diferença será muito significativa.