Desenvolvimento - ASP. NET

Compactando ViewState – ASP.NET

Este artigo mostra como reduzir o tamanho de um Viewstate, ganhando maior facilidade no carregamento de páginas que geram Viewstate com um tamanho significativamente grande.

por Francke Peixoto



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 SavePageStateToPersistenceMedium

Nossa 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.aspx]

Abaixo 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.

Francke Peixoto

Francke Peixoto