Escrito em March 18th, 2009 as 7:26 pm por

5 Comentários

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
Se você gostou do post, deixe um comentário ou assine nosso RSS RSS.

Posts Relacionados:

  1. Converter um Array de Bytes para String e String para Array de Bytes
  2. Compressão de (Compactar) Dados
  3. Calculando CRC de Strings (Texto), Array’s e Arquivos
  4. Convertendo String Delimitada por Tamanho (Trancode) em Array
  5. Algoritmo para Validação de CPF
  6. Convertendo Caminhos Absolutos e URL’s Absolutas para Caminhos Relativos e URL’s Relativas
  7. .Net Framework Inside : Enumeradores (Enums)
, , , , ,

5 Respostas to “Compressão de (Compactar) ViewState”


  1. Lexus

    2 years ago

    Good site, admin.


  2. guibacellar

    2 years ago

    Thanks a lot.
    Is very important receive users feedback to improve the website, the articles and to inspirate our job.


  3. mark

    2 years ago

    If you have to do it, you might as well do it right


  4. Agran

    2 years ago

    Great site, Good info


  5. cialis

    2 years ago

    Great topic. Now i can say thank you

Deixa uma Resposta

znjdb32s6g