ViewState Caching in ASP.NET

Este articulo permite caching del ViewState en las versiones del framework <=3.5

Uno de los componentes  para mejorar la escalabilidad de una aplicación web es la reducción de la carga que se genera y que se reenvía al navegador del cliente.

El ViewState, como ya  todos hemos aprendidos, es un conjunto de datos que identifica el estado de ASP.NET  entre un post y otro. Esto supone que, en caso de utilizo de este ya que se puede deshabilitar aunque con algunos cambios de diseño de nuestra aplicación, su presencia entre una llamada y la otra tiene que ser garantizada.

Con este código, podemos olvidarnos del efecto que tiene y ViewState en la carga porque lo vamos a sustituir con “nada”. De esta forma ya podremos concentrarnos en añadir funcionalidades de compresión del servidor, caching y más.

Este código permite:

1.       Reducir el tamaño del ViewState enviado al cliente, de hecho no se le va a enviar;

2.       Registrar el ViewState en el servidor;

Esto supone dos grandes mejorías respecto a las técnicas “comunes” de compresión:

1.       El tamaño del ViewState será de 0 KB;

2.       No se efectúan procesos de compresión/descompresión en cada llamada;

En este ejemplo se crea un lector rápido de RSS utilizando objetos comunes del framework 3.5.

Lo interesante de esto es poder comprobar que, sin la registración del ViewState, la carga añadida a esta consulta por el ViewState es de 62,4 KB (63.959 bytes).

No estaremos más tiempo a calcular lo que suponen 100 operadores por  una media de 3 veces al día por todos los días laborares del año

AHORRAR

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" />

 

Para poder llegar aquí utilizamos los overloads disponibles durante la preparación del ViewState para guardar los datos de la siguiente forma:


 

 

VB.NET

    ''' <summary>

    ''' Overload del SavePageState;

    ''' Registra en Cache el valor del viewstate que la pagina tendria que recibir;

    ''' Se crea un valor univoco por cada host ip con date ticks y se crea como campo hidden; __VIEWSTATE_KEY

    ''' </summary>

    ''' <remarks></remarks>

    Protected Overrides Sub SavePageStateToPersistenceMedium(ByVal state As Object)

 

        Dim str As String = String.Format("VS_{0}_{1}", Request.UserHostAddress, DateTime.Now.Ticks)

        Cache.Add(str, state, Nothing, DateTime.Now.AddMinutes(Session.Timeout), _

TimeSpan.Zero, _

CacheItemPriority.Default, Nothing)

        ClientScript.RegisterHiddenField("__VIEWSTATE_KEY", str)

 

    End Sub

 

    ''' <summary>

    ''' Recupera el Viewstate desde la cache utilizando el valor univoco __VIEWSTATE_KEY;

    ''' </summary>

    Protected Overrides Function LoadPageStateFromPersistenceMedium() As Object

 

        Dim str = Request.Form("__VIEWSTATE_KEY")

        If Not str.StartsWith("VS_") Then

            Throw New Exception("Invalid ViewState")

        End If

        Return Cache(str)

 

    End Function

C#

    protected override void SavePageStateToPersistenceMedium(object state)

    {

        string str = string.Format("VS_{0}_{1}", Request.UserHostAddress, DateTime.Now.Ticks.ToString());

        Cache.Add(str, state, null, DateTime.Now.AddMinutes(Session.Timeout), TimeSpan.Zero, CacheItemPriority.Default, null);

        ClientScript.RegisterHiddenField("__VIEWSTATE_KEY", str);

    }

 

    protected override object LoadPageStateFromPersistenceMedium()

    {

        string str = Request.Form["__VIEWSTATE_KEY"];

        if (!str.StartsWith("VS_"))

            throw new Exception("Invalid viewstate key:" + str);

       

        return Cache[str];

    }

Codigo ASP.NET

        <asp:XmlDataSource ID="xmlDataSource" runat="server"

            DataFile="~/App_Data/rss.xml" XPath="/rss/channel/item"></asp:XmlDataSource>

        <asp:DataList ID="dataList" runat="server" DataSourceID="xmlDataSource" />

            <ItemTemplate>

                <asp:Label ID="lbDate" runat="server" Text='<% #XPath("pubDate") %>'></asp:Label>

<br />

                <asp:CheckBox AutoPostBack="true" ID="ckItem" runat="server"Text='<% #XPath("title") %>' />

<br />

                <asp:Label ID="lbDescription" runat="server" Text='<% #XPath("description") %>'></asp:Label>

                <hr />

            </ItemTemplate>

 

        </asp:DataList>

6 Comments

Comments have been disabled for this content.