Quem não ouviu falar em compressão HTTP?
Bom, tenho lido muitos “artigos” dizendo que compressão HTTP resolve todos os problemas, mas, não é assim.
A compressão otimiza somente o Download das informações e não o Upload, então usar a compressão HTTP não adianta para os casos em que o ViewState da aplicação é muito grande, pois, sendo um campo (input) hidden ele é submetido no ato do post do formulário.
Todas as páginas .NET possuem e métodos que podem ser sobrescritos e que são responsáveis pelo Armazenamento e Recuperação dos dados no ViewState (LoadPageStateFromPersistenceMedium e SavePageStateToPersistenceMedium) respectivamente.
O ViewState na verdade é um campo (input) do tipo Hidden, então a ideia da compressão é interceptar os dados e registrar um novo campo Hidden (_CVIEWSTATE) que irá conter os dados.
Desta forma, o envio dos dados para o cliente (Download) e o envio para o servidor (Upload/Post) podem contar com um ViewState mais enxuto.
Para utilizar o código abaixo será necessário o código do artigo sobre compressão. Para ver o artigo, clique aqui.
C#
protected override object LoadPageStateFromPersistenceMedium()
{
// Cria Objetos
string compressedViewStateTextData;
string descompressedViewStateTextData;
byte[] viewStateArrayData;
LosFormatter losFormatter;
// Inicializa o LosFormatter
losFormatter = new LosFormatter();
// Recupera o Campo Hidden da Página
compressedViewStateTextData = Request.Form["_CVIEWSTATE"];
// Converte o Texto (Base64) para Array de Bytes
viewStateArrayData = Convert.FromBase64String(compressedViewStateTextData);
// Realiza Descompressão dos Dados
viewStateArrayData = new CompressorGenerico.Compressor().Decompress(viewStateArrayData);
// Converte o Array de Bytes Descomprimido para Texto
descompressedViewStateTextData = Convert.ToBase64String(viewStateArrayData);
// Retorna o Resultado da Deserialização do Objeto
return losFormatter.Deserialize(descompressedViewStateTextData);
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
// Cria Objetos
LosFormatter losFormatter;
StringWriter stringWriter;
string unCompressedViewStateString;
string compressedViewStateString;
byte[] bytes;
// Inicializa o LosFormatter
losFormatter = new LosFormatter();
// Inicializa o StringWriter
using (stringWriter = new StringWriter())
{
// Realiza a Serialização
losFormatter.Serialize(stringWriter, viewState);
// Converte para String o Conteúdo
unCompressedViewStateString = stringWriter.ToString();
}
// Converte o Texto de Base64 para Array de Bytes
bytes = Convert.FromBase64String(unCompressedViewStateString);
// Realiza a Compressão
bytes = new CompressorGenerico.Compressor().Compress(bytes);
// Converte o Array de Bytes para Base64
compressedViewStateString = Convert.ToBase64String(bytes);
// Adiciona o Field do Tipo Hidden
ClientScript.RegisterHiddenField("_CVIEWSTATE", compressedViewStateString);
}
VB.NET
Protected Overrides Function LoadPageStateFromPersistenceMedium() As Object
' Cria Objetos
Dim compressedViewStateTextData As String
Dim descompressedViewStateTextData As String
Dim viewStateArrayData As Byte()
Dim losFormatter As LosFormatter
' Inicializa o LosFormatter
losFormatter = New LosFormatter()
' Recupera o Campo Hidden da Página
compressedViewStateTextData = Request.Form("_CVIEWSTATE")
' Converte o Texto (Base64) para Array de Bytes
viewStateArrayData = Convert.FromBase64String(compressedViewStateTextData)
' Realiza Descompressão dos Dados
viewStateArrayData = New CompressorGenerico.Compressor().Decompress(viewStateArrayData)
' Converte o Array de Bytes Descomprimido para Texto
descompressedViewStateTextData = Convert.ToBase64String(viewStateArrayData)
' Retorna o Resultado da Deserialização do Objeto
Return losFormatter.Deserialize(descompressedViewStateTextData)
End Function
Protected Overrides Sub SavePageStateToPersistenceMedium(ByVal state As Object)
' Cria Objetos
Dim losFormatter As LosFormatter
Dim stringWriter As StringWriter
Dim unCompressedViewStateString As String
Dim compressedViewStateString As String
Dim bytes As Byte()
' Inicializa o LosFormatter
losFormatter = New LosFormatter()
' Inicializa o StringWriter
stringWriter = New StringWriter()
Using (stringWriter)
' Realiza a Serialização
losFormatter.Serialize(stringWriter, state)
' Converte para String o Conteúdo
unCompressedViewStateString = stringWriter.ToString()
' Converte o Texto de Base64 para Array de Bytes
bytes = Convert.FromBase64String(unCompressedViewStateString)
' Realiza a Compressão
bytes = New CompressorGenerico.Compressor().Compress(bytes)
' Converte o Array de Bytes para Base64
compressedViewStateString = Convert.ToBase64String(bytes)
' Adiciona o Field do Tipo Hidden
ClientScript.RegisterHiddenField("_CVIEWSTATE", compressedViewStateString)
End Using
End Sub
Posts Relacionados:
- Converter um Array de Bytes para String e String para Array de Bytes
- Compressão de (Compactar) Dados
- Calculando CRC de Strings (Texto), Array’s e Arquivos
- Convertendo String Delimitada por Tamanho (Trancode) em Array
- Algoritmo para Validação de CPF
- Convertendo Caminhos Absolutos e URL’s Absolutas para Caminhos Relativos e URL’s Relativas
- .Net Framework Inside : Enumeradores (Enums)



5 Respostas to “Compressão de (Compactar) ViewState”
Lexus
2 years ago
Good site, admin.
guibacellar
2 years ago
Thanks a lot.
Is very important receive users feedback to improve the website, the articles and to inspirate our job.
mark
2 years ago
If you have to do it, you might as well do it right
Agran
2 years ago
Great site, Good info
cialis
2 years ago
Great topic. Now i can say thank you