lunes, 20 de febrero de 2012

UN TUTORIAL PARA PRINCIPIANTES EN ASP.NET PARA ADMINISTRACIÓN DE ESTADOS


Introducción

Este artículo analiza la necesidad de que la administración del estado en las aplicaciones ASP.NET, ¿cuáles son las distintas formas de gestión estatal en ASP.NET y un análisis comparativo de todas las técnicas de administración de estado.

En el fondo

HTTP es un protocolo sin estado. Una vez que el servidor sirve las peticiones cursadas por el usuario, se limpia todos los recursos utilizados para atender esa petición. Estos recursos incluyen los objetos creados durante esa solicitud, la memoria asignada en esa solicitud, etc Para un tipo que viene de un fondo de desarrollo de aplicaciones Windows, esto podría ser una gran sorpresa porque no hay manera de que podía confiar en los objetos y miembros las variables por sí solas para realizar un seguimiento del estado actual de la aplicación.

Si tenemos que seguir la información de los usuarios entre las visitas a la página e incluso en múltiples visitas de la misma página, entonces tenemos que utilizar las técnicas de gestión del Estado proporcionados por ASP.NET. La gestión del Estado es el proceso mediante el cual los desarrolladores de ASP.NET permiten mantener información de estado y la página sobre el pedido múltiple de las mismas páginas o diferentes.

Tipos de la administración del estado

Hay principalmente dos tipos de gestión estatal que ASP.NET ofrece:

  1. Del lado del cliente de administración de estado
  2. El lado del servidor de administración de estado
Cuando usamos el lado del cliente la administración del estado, la información de estado relacionada se almacenan en el lado del cliente. Esta información viaja de ida y vuelta con cada petición y respuesta. Esto puede ser visualizado como:

Nota: Imagen tomada del libro de Microsoft Press.

La ventaja principal de tener este tipo de gestión del Estado es que a aliviar el servidor de la carga de mantener actualizada la información relacionada con el estado, se ahorra una gran cantidad de memoria del servidor. La desventaja de la administración del estado del lado del cliente es que se necesita más ancho de banda considerable cantidad de datos está viajando de ida y vuelta. Pero hay otro problema que es más grande que el problema del ancho de banda. El lado del cliente la administración del estado hace que la información viaja de ida y vuelta y por lo tanto esta información puede ser interceptada por alguien en el medio. Así que no hay manera de que podamos almacenar la información confidencial como contraseñas, número de tarjeta de crédito y el importe a pagar en el lado del cliente, tenemos que del lado del servidor de gestión de estado para estas cosas.

El lado del servidor de gestión estatal, en contraste con el lado del cliente, mantiene toda la información en la memoria del usuario. La desventaja de esto es más el uso de memoria en el servidor y el beneficio es que la información de los usuarios es confidencial y segura.

Nota: Imagen tomada del libro de Microsoft Press.

No podemos decir que vamos a utilizar un solo tipo de gestión estatal en nuestra aplicación. Tendremos que encontrar una mezcla de lado del cliente y la gestión del lado del servidor del Estado en función del tipo y el tamaño de la información. Ahora echemos un vistazo a lo que son las diferentes maneras en que puede manejar el estado en el lado cliente y del servidor.

Del lado del cliente las técnicas de administración de estado
  • Ver Estado
  • Control del Estado
  • Los campos ocultos
  • Galletitas
  • Cadenas de consulta
Ver Estado - ViewState

ASP.NET utiliza este mecanismo para el seguimiento de los valores de los controles en la página web entre la solicitud de página para una misma página. También podemos añadir valores personalizados para ver el estado. El marco ASP.NET se encarga de almacenar la información de los controles en el estado de vista y recuperar de nuevo de estado de vista antes de renderizar la devolución de datos.

Si tenemos que usar ViewState para almacenar nuestra información, sólo tenemos que recordar que el estado de vista es un objeto de diccionario. Podemos tener nuestros datos almacenados como un par de valores clave en el estado de vista (véase el código de abajo). La información que los controles también se está ordenada en este diccionario en la petición y se rellena de nuevo durante la respuesta.

Dado que esta información se almacena en la propia página web, ASP.NET codifica la información. Podemos ajustar los parámetros relacionados con el cifrado de web.config.

<Configuration>
       <system.web>
        <pages viewStateEncryptionMode="Always"/>
      </system.web>
</configuration>

o en la página declarativa:

<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" 
ViewStateEncryptionMode="Always"%>


Veamos ahora en una aplicación pequeña de estado de vista. Contamos con una simple página web con un cuadro de texto y un botón. La idea es que vamos a escribir algo en el cuadro de texto y ver cómo ASP.NET almacena esta información en el estado de vista. Vamos a almacenar nuestra propia información en el estado de vista también. Al ejecutar la página y escribir mi nombre en el cuadro de texto y pulse el botón, se produce una devolución de datos, pero mi nombre se mantiene en el cuadro de texto. Viewstate hecho posible así que después de la devolución de datos, la página se ve así:

Cuando nos fijamos en la fuente, el estado de vista se parece a:

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



Ahora vamos a tratar de añadir nuestra propia información en el estado de vista. Vamos a 
llevar un registro de devolución de datos de los usuarios en esta página. Cada vez que el 
usuario se presiona un botón, vamos a añadir 1 al valor de marihuana almacenadas. La forma 
de hacerlo sería la siguiente:

protected void Page_Load(object sender, EventArgs e)
{
    if(IsPostBack == true)
    {
        if (ViewState["number"] != null) //Lets retrieve, increase and store again
        {
            ViewState["number"] = Convert.ToInt32(ViewState["number"]) + 1;
        }
        else //First postback, lets store the info
        {
            ViewState["number"] = 1;
        }

        Label1.Text = ViewState["number"].ToString();
    }
}
Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nosmostrará las devoluciones de datos está haciendo hasta ahora que se está almacenando en el estado de vista:

client side
El estado de vista está habilitado por defecto, pero podemos deshabilitar estableciendo la propiedad EnableViewState para cada control en la web en false. Esto reduce el tiempo de procesamiento del servidor y disminuye el tamaño de la página.


Control del Estado

Ahora sabemos lo que es un estado de vista es, y también sabemos que podemos desactivar el estado de vista de los controles en la página. Pero imagino que si estamos desarrollando un control personalizado y el interior están el uso de ViewState para almacenar alguna información, pero el usuario del control se puede desactivar el estado de vista de nuestro control. Para evitar este problema, podemos tener un comportamiento similar al estado de vista que no puede ser desactivado por los usuarios de control y se llama ControlState. Los estados de control se encuentra dentro de los controles personalizados y funcionan igual que funciona viewstate.

Para utilizar el estado del control en un control personalizado, tenemos que reemplazar el método OnInit y llame al método RegisterRequiresControlState durante la inicialización. Entonces tenemos que reemplazar los métodos SaveControlState y LoadControlState.

Campos ocultos

Campo oculto son los controles previstos por el ASP.NET y y permiten almacenar información en ellos. La única restricción es que en los campos ocultos, mantendrán la información cuando el post HTTP se envía, es decir, hace clic en el botón. No va a funcionar con HTTP gey. Vamos a hacer el mismo ejercicio de hacer el seguimiento de las devoluciones de datos utilizando HiddenFields ahora.
(Nota: ViewState también utiliza campo oculto por debajo.)

//Store in Hidden Field -----------------------------------------------------------
int newVal = Convert.ToInt32(HiddenField1.Value) + 1; //Hidden field default value was 0
HiddenField1.Value = newVal.ToString();
Label2.Text = HiddenField1.Value;
Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nos mostrará las devoluciones de datos está haciendo hasta ahora que se está almacenando en HiddenFields (Ver código para más detalles).

Galletitas

Hay situaciones en que tenemos que almacenar los datos entre las peticiones de páginas. Hasta ahora, las técnicas que hemos discutido almacenan los datos de las solicitudes de páginas individuales. Ahora nos centraremos en las técnicas que almacenan información entre solicitudes de páginas.

Las cookies son pequeñas piezas de información que pueden ser almacenados en un archivo de texto en el ordenador del usuario. La información se puede acceder por el servidor y se puede utilizar para almacenar información que se requiere entre las visitas de página y entre las múltiples visitas en la misma página por parte del usuario. Vamos a hacer el mismo ejercicio de hacer el seguimiento de la devolución de datos mediante el uso de cookies.

int postbacks = 0;
if (Request.Cookies["number"] != null) //Lets retrieve, increase and store again
{
    postbacks = Convert.ToInt32(Request.Cookies["number"].Value) + 1;
}
else //First postback, lets store the info
{
    postbacks = 1;
}
Response.Cookies["number"].Value = postbacks.ToString();

Label3.Text = Response.Cookies["number"].Value;

No podemos hacer un seguimiento de las devoluciones de datos que utilizan las cookies como cookies permaneceran en la máquina del usuario, por lo que en esencia estamos ante el número de veces el usuario ACCEDE en su página hasta el momento desde el comienzo.

Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nos mostrará las devoluciones de datos que se han hecho hasta ahora, que está siendo almacenada en Cookies (véase el código para más detalles). Las cookies pueden tener varios parámetros como el tiempo que son válidas y cuándo deben caducar. Estos parámetros pueden ser manipulados como:

Response.Cookies["number"].Expires = DateTime.Now.AddDays(1);


Esta cookie expira después de 1 día de su creación.

Cadenas de consulta

Las cadenas de consulta se utilizan para almacenar las variables que identifican páginas específicas, tales como términos de búsqueda o números de página. Una cadena de consulta es la información que se anexa al final de la URL de la página. Se pueden utilizar para almacenar / pasar información de una página a otra e incluso a la misma página. Vamos a trabajar sobre el almacenamiento de la información de devolución de datos en cadenas de consulta ahora:

//GetDataItem from querystring
if (Request.QueryString["number"] != null) //Lets retrieve, increase and store again
{
    Label4.Text = Request.QueryString["number"];
}

//set in query string
int postbacks = 0;

if (Request.QueryString["number"] != null) //Lets retrieve, increase and store again
{
    postbacks = Convert.ToInt32(Request.QueryString["number"]) + 1;
}
else //First postback, lets store the info
{
    postbacks = 1;
}

Response.Redirect("default.aspx?number=" + postbacks);
Una cosa a notar aquí es que no hay manera de almacenar la información de devolución de datos en la cadena de consulta que se envía con la misma página. La razón es que la cadena de consulta crea una nueva dirección URL cada vez y será una nueva solicitud cada vez que utilice cadenas de consulta. Así que ahora, esencialmente hacemos seguimiento al número de clics aquí. La idea detrás de la cadena de consulta es pasar pequeña información a OTRAS páginas que pueden ser utilizados para llenar la información en esa página.

NOTA: El uso de cookies y QueryString aquí son sólo para propósitos de demostración. En escenarios reales, nunca debe ser usado para almacenar información necesaria para la misma página. Las cadenas de consulta se debe utilizar para almacenar la información de las visitas de varias páginas. Las cookies se utilizan para almacenar información entre múltiples visitas a nuestra página web desde la misma computadora.

Estado de la aplicación

ASP.NET permite guardar valores utilizando el estado de la aplicación. Un mecanismo de almacenamiento global que sea accesible desde todas las páginas de la aplicación web. El estado de aplicación se almacena en la Solicitud de clave / valor del diccionario. Esta información también estará disponible para todos los usuarios de la web. En caso de que necesitemos información específica del usuario, entonces es mejor usar sessionState.

ASP.NET proporciona tres eventos que le permiten inicializar las variables de aplicación (liberando recursos cuando se cierra la aplicación) y responder a los errores de aplicación:


  • Application_Start: Se produce cuando se inicia la aplicación. Este es el lugar perfecto para inicializar las variables de la aplicación.
  • Application_End: Se produce cuando una aplicación se cierra. Utilice esta aplicación a los recursos libres y realizar el registro.
  • Application_Error: Se produce cuando se produce un error no controlado. Use esto para realizar el registro de errores.
Vamos ahora a almacenar la información de las devoluciones de datos en el estado de la aplicación:

//global.asax
void Application_Start(object sender, EventArgs e)
{
    Application["number"] = 0;
}

//In web pages
Application.Lock();
Application["number"] = Convert.ToInt32(Application["number"]) + 1;
Application.UnLock();

Label5.Text = Application["number"].ToString();
Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nos mostrará las devoluciones de datos está haciendo hasta ahora que se está almacenando en ApplicationState. Podemos utilizar este objeto para realizar un seguimiento de los clics por todos los usuarios en todo el sitio web (véase el código para más detalles).

Estado de la sesión

Como estado de la aplicación, esta información también está en un almacenamiento global que sea accesible desde todas las páginas de la aplicación web. El estado de sesión se almacena en el diccionario SessionKey / valor. Esta información estará disponible para el usuario actual, es decir, la sesión, actual.

//global.asax
void Session_Start(object sender, EventArgs e)
{
    // Code that runs when a new session is started
    Session["number"] = 0;
}

// Web forms
Session["number"] = Convert.ToInt32(Session["number"]) + 1;

Label6.Text = Session["number"].ToString();
Al ejecutar la página y pulsa el botón para hacer una devolución de datos, la web nos mostrará las devoluciones de datos está haciendo hasta ahora que se está almacenando en SessionState. Podemos utilizar este objeto para realizar un seguimiento de clics el usuario actual, es decir, que es propietaria de la sesión para el sitio web completo (véase el código para más detalles).

Ventajas de la administración de estados del lado del cliente

  • Mayor escalabilidad
  • Soporte para múltiples navegadores
Ventajas de la administración de estados del lado del Servidor
  • Mayor seguridad
  • Reducción del ancho de banda
Puntos de interés Este pequeño documento se ha creado para conocer un poco de material de revisión sobre la gestión de estados. Pensé que dará a conocer en CodeProject para que algunos principiantes puedan encontrar algo útil en ella. En resumen las técnicas de gestión de estados son: • Del lado del cliente la administración del estado debe ser usado cuando Identificación escalabilidad requerida. • El lado del servidor de gestión del Estado debe ser utilizada cuando se requiere seguridad de los datos. • Página por defecto a nivel estatal técnica de gestión utilizado por ASP.NET es ViewState. • Podemos almacenar información personalizada en ViewState. • Controles personalizados ControlState utilizar para almacenar la información. • Campo oculto también se puede utilizar para almacenar información para la misma página. • Las cookies se pueden utilizar para la información que se requiere en múltiples visitas desde el mismo ordenador. • Cadena de consulta se puede utilizar para pasar información de una página a otra. • ApplicationState se debe utilizar para almacenar información que debería ser accesible desde todas las páginas web y para todos los usuarios. • SessionState debe utilizarse cuando la información debe estar disponible en todas las páginas web, pero para el usuario actual.

Agradecimientos: Rahul Rajat Singh y CodeProject




No hay comentarios:

Publicar un comentario