Aspectos fundamentales de la programación ASP.NET (parte 5)

Quinta y ultima parte del bloque que hablo de Aspectos fundamentales de la programación ASP.NET. Primero sería bueno leer la primer parte,la segunda, la tercera y la cuarta.

Ejecución de una página ASP.NET

Parte fundamental para entender como funciona ASP.NET y como puede afectar esto a tu forma de programar tus aplicaciones web. Ya he dicho antes que ASP.NET se planteó que la programación fuera “Event driven” que significa que cada página genera eventos.

Entender cual es el orden de generación de los eventos es esen-cial para programar correctamente.

Para verlo hablamos del ciclo de vida de la página. Aquí vas a encontrar un resumen del ciclo. Cuando llega una petición :

Construir el árbol de controles

Verás que las páginas en ASP.NET utilizan controles de servidor y esos controles están ordenados en forma de árbol tal y como ya pasa en las aplicaciones Winforms.

Evento Init

El primer evento que se ejecuta en una página es el Init. Tienes creados los controles pero estos aún no tienen los valores.

Cargar el estado y los datos recibidos

Aquí es donde se guardan los datos en los controles. En el caso que la petición sea un submit de un formulario previamente enviado también se guardaran estos valores nuevos.

Evento Load

El evento más comúnmente utilizado. Es donde tienes acceso a los valores en los controles. Aquí es importante no hacer inicializaciones sin antes comprobar que no se está realizando una petición Postback. Postback es la forma que tenemos para llamar las peticiones que envían información al servidor. Es decir, las llamadas creadas mediante una acción del usuario. No son Postback cuando la petición es directa mediante la barra de navegación del explorador o mediante un link simple (etiqueta a) de la página.

Evento acción del usuario / evento cambios en controles

Si se trata de una petición Postback quiere decir que el usuario ha realizado una acción, como por ejemplo el clic de un botón, esta acción es un evento que se debe tratar. También pueden ocurrir otros eventos que no tienen por que ser acciones de botones. Pueden ser eventos producidos por el cambio en una lista, el cambio en un texto. Este tipo de eventos también se tratan.

Evento LoadComplete

El evento anterior a procesar la página para su entrega al cliente.

Guardar el estado

Una de las características del ASP.NET es la utilización en cada página de una variable de estado denominada ViewState que permite recuperar el estado en que se ha enviado inicialmente la página. Fíjate que sin el ViewState no podrías saber que eventos de modificación se han producido.

Renderizar los controles

Otra característica de ASP.NET es la utilización de controles de servidor. Estos controles se caracterizan por empezar en “asp:”, tener un ID y un runat=”server”. Estos controles no pueden ser interpretados por ningún navegador ya que ellos solo interpretan Html. Por eso antes de enviar necesitas transformar los controles de servidor en Html.

Evento Unload

Ultimo evento en el ciclo. Se pueden liberar recursos ocupados en el proceso.

La siguiente tabla tienes todos los eventos que se generan en el ciclo de ejecución de una página. Al lado tienes los que se generan en cada uno de los controles.

aspnet cycle

Más cosas de los eventos

Los eventos producidos por cambios en los controles siempre se ejecutan cuando hay un Postback. Recuerda que un Postback es cuando llega una solicitud al servidor producido por una acción del cliente. Esta acción puede ser la pulsación de un botón como también la selección de otro elemento de una lista.

Algunos controles tienen una propiedad AutoPostBack que poniéndola a cierto provocas que cualquier cambio produzca esta acción.

Puedes tener varios controles en una misma página que generen eventos de modificación. El orden en el servidor no esta establecido y por tanto es aleatorio.

Como ya te he dicho antes sin el ViewState no se pueden generar eventos de modificación. El ViewState en los controles se puede deshabilitar. Páginas que sean demasiado pesadas puedes quitarle este peso deshabilitando el ViewState de algunos controles o incluso de toda la página.

Anuncis

Aspectos fundamentales de la programación ASP.NET (4rta parte)

Cuarta parte del bloque que hablo de Aspectos fundamentales de la programación ASP.NET. Primero sería bueno leer la primer parte,la segunda y la tercera.

ASP.NET Modelo en objetos

Muchos son los objetos utilizados en el procesado de ASP.NET pero hay uno que siempre tiene que estar presente en tu memo-ria ya que lo trae prácticamente todo. HttpContext es la clase que representa una petición y su res-puesta a un recurso de la web. Context es la propiedad de la clase Page que te permite tener acceso a la instancia de la clase generada por la petición. También puedes acceder por la pro-piedad estática Current de la clase HttpContext.

Page.Context HttpContext.Current

El objeto Current tiene propiedades tan importantes y utiliza-das como:

  • Request : Representa la petición. Es una instancia de HttpRequest. Puedes acceder a la cadena Url como a las cookies.
  • Response: Representa la respuesta que debe generar el servidor. Es una instancia de la clase HttpResponse. Dispone de métodos de redireccionamiento a otras UR-L’s y métodos de escritura directa por el canal de salida.
  • User: Representa el usuario autentificado que realiza la consulta. Es la implementación de una interfaz genérica IPrincipal que puedes consultar el nombre de usuario y el rol asociado.
  • Server: Representa el servidor. Es una instancia de HttpServerUtility. Encuentras métodos para transferir la solicitud a otra página y para recuperar la dirección físi-ca dentro del disco de un recurso.
  • Session: Objeto que puedes guardar valores que sirven para mantener el estado entre peticiones.
  • Profile: Objeto que te permite leer y guardar valores que sirven para mantener el estado entre sesiones.
  • Items: Diccionario de objetos que se guardan durante la solicitud.
  • Application: Diccionario global en todas las solicitudes a la aplicación. Compartido por todos los usuarios.

Web.config

El archivo de configuración de las aplicaciones web. Este ar-chivo se encuentra en la raíz de la aplicación y es básico para el correcto funcionamiento. En este archivo que esta estructurado en formato XML se en-cuentran cosas tan importantes como:

  • Cadenas de conexiones: Las cadenas de conexión a las bases de datos que utiliza la aplicación web.
  • Autorizaciones: Permisos aplicados a carpetas o re-cursos de la aplicación web.
  • Autenticaciones: Como se deben autenticar los usua-rios. También puede contener usuarios y contraseñas encriptadas.
  • Propiedades de configuración de la aplicación: Una colección de claves y valores que se utilizan en la aplicación.
  • Perfiles: Para mantener el estado entre sesiones.
  • Proveedores de usuarios: ASP.NET tiene su propio gestor de usuarios. Puedes modificarlo para adaptarlo.
  • Proveedores de roles: ASP.NET tiene su propio ges-tor de roles. Puedes modificarlo para adaptarlo.

La herencia en web.config

webconfig

Los ficheros de configuración pueden estar en cualquier sub-carpeta de la misma. Posibilita así una herencia de configura-ciones donde se puede romper en cualquier momento e incluso sobreescribirlo. Así podrías tener una carpeta completamente pública y dentro una carpeta completamente privada. El archivo base del web.config es el machine.config. Este ulti-mo tiene su ámbito en todo el servidor. Uno de los cambios en-tre ASP.NET 3.5 y 4.0 es que web.config reduce significativa-mente su tamaño ya que la mayoría han pasado al machi-ne.config. Naturalmente puedes sobreescribirlo añadiéndolo en el web.config.

Aspectos fundamentales de la programación ASP.NET (3era parte)

Tercera parte del bloque que hablo de Aspectos fundamentales de la programación ASP.NET. Primero sería bueno leer la primer parte y la segunda.

Cookies

Una de las formas que tienes de poder conservar el estado en tus peticiones Http es utilizando Cookies. Ya he hablado de que el protocolo Http no tiene estado, significa que cada petición es independiente de la anterior, e implica que para cada petición necesitas enviar toda la información necesaria para que el servidor pueda recordar quien eres y que habías hecho para saber que quieres hacer. Eso es lo que denominamos mantener el estado.

Las cookies son ficheros de texto simples que se guardan en el ordenador del cliente y se adjuntan a las peticiones Http. Se habla mucho de las cookies y del peligro de seguridad que suponen. Al ser una información que viaja por la red y que se queda guarda en el cliente no la puedes utilizar para almacenar información importante o susceptible para el buen comportamiento de tus aplicación web.

Normalmente se utilizan las cookies para ayudar a la aplicación web saber que páginas has estado visitando antes.

Internet Information Server (IIS)

Toda aplicación web ya sea estática o dinámica necesita de un servidor web para poder entregar las páginas. En Microsoft tenemos el IIS. El IIS es el responsable de entregar las páginas que se solicitan mediante una petición Http. En el caso de ASP.NET necesita la instalación del Framework para que el IIS sepa interpretar los archivos con extensión .aspx.

Microsoft Windows Server 2003 trabaja con IIS 6, Microsoft Windows Server 2008 con IIS 7. Existe un cambio importante entre las dos versiones.

La aplicación web se guarda en una carpeta del servidor que por defecto es wwwroot en la unidad de instalación del sistema operativo.

 

Directorios virtuales

Configura una carpeta para que funcione como una aplicación web. Una aplicación web funciona mediante un pool de aplicaciones que puede ser distinto para cada web permitiendo aislar la web de todas las demás.

iis_4

Procesado ASP.NET

Como se comporta el IIS ante una petición a una página ASPX sirve para entender un poco más como funciona la lógica de proceso ASP.NET.

Ya he hablado que existen dos versiones actualmente del IIS y que habían cambios importantes, con la siguiente explicación espero poder aclarar en que se basan.

Procesado en IIS6 / IIS7 Modo clásico

iis_5

El IIS tiene la responsabilidad para cada solicitud de comprobar restricciones IP, permisos de lectura y ejecución de la página solicitada y si es de acceso anónimo o necesita una autenticación. En IIS 6 solo puedes gestionar la autenticación por Windows.

Después la solicitud es recogida por el proceso de trabajo ASP.NET donde se evalúa la autorización de acceso al recurso solicitado, si es necesario una autenticación por formularios, sobreescritura de la URL, recuperación de la sesión, gestión de la caché, servicios personalizados, creación de los objetos ASP.NET. Todo esto es lo que se hace en la Pipeline.

En la primera solicitud se carga el ensamblado en el dominio de la aplicación y se crea una instancia del objeto. Recuerda que ya he comentado que en .Net todo es un objeto incluso las páginas en ASP.NET.

iis_6

Con la instancia del objeto creado se procesa y se genera una respuesta.

El ensamblado se queda guardado en el dominio de la aplicación para posteriores peticiones. De esta forma las peticiones siguientes serán más rápidas.

Procesado en IIS7 Modo integrado

En la nueva versión del IIS hay módulos ASP.NET integrados que permite coger más responsabilidad en el procesado de las páginas ASP.NET. Ahora el Pipeline está en el IIS, de esta forma la autorización, autenticación o caché de salida sirve para páginas estáticas, páginas php, etc.

También IIS7 permite la autenticación por formularios.

ASP.NET 4 Versión IIS 7.5

Con el Microsoft Windows Server 2008 R2 aparece una versión mejorada del 7. El IIS 7.5 tiene la novedad que junto a ASP.NET versión 4 del .Net Framework puedes programar el auto arranque de las aplicaciones web hospedadas en el IIS. Tal y como he hablado antes las primeras peticiones cargan el ensamblado en el dominio de la aplicación, esto supone claro una perdida de tiempo. Para evitarlo tienes el auto arranque.

Para ello debe indicar qué pool de aplicaciones son arrancados automáticamente. Tienes que editar el fichero de configuración applicationhost.config

<applicationPools>

<add name=”MyApplicationPool” startMode=”AlwaysRunning” />

</applicationPools>

o puedes indicar individualmente aplicaciones para que se auto carguen al inicializar el IIS.

<sites>

<site name=”MySite” id=”1″>

<application path=”/” serviceAutoStartEnabled=”true” serviceAutoStartProvider=”PrewarmMyCache” >

<!– Additional content –>

</application>

</site>

</sites>

<!– Additional content –>

<serviceAutoStartProviders>

<add name=”PrewarmMyCache” type=”MyNamespace.CustomInitialization, MyLibrary” />

</serviceAutoStartProviders>

El funcionamiento es muy simple: En el momento que IIS arranca por primera vez o se reinicia un pool de aplicaciones IIS 7.5 envía una solicitud al objeto CustomInitialization para que ejecute el método PreLoad. En este momento las solicitudes quedan bloqueadas.

Después se carga el ensamblado en el dominio de la aplicación y se libera el bloqueo.

public class CustomInitialization :

System.Web.Hosting.IProcessHostPreloadClient

{

public void Preload(string[] parameters)

{

// Perform initialization.

}

}

La interfaz IProcessHostPreloadClient permite la implementación del método PreLoad utilizada en IIS 7.5 como punto de entrada en la pre carga de una aplicación web.

Más cosas en la cuarta parte de este post.
Gracias

Aspectos fundamentales de la programación ASP.NET (2na parte)

Segunda parte del bloque que hablo de Aspectos fundamentales de la programación ASP.NET. Primero sería bueno leer la primer parte.

HTML, páginas estáticas

Es el escenario más simple que puedes tener en una web. Ahora prácticamente son todas dinámicas, hay ya pocas webs que utilicen páginas estáticas Html.

Una página Html contiene etiquetas que indican a los navegadores como tienen que renderizar el contenido.

Al final, todas las páginas dinámicas terminan enviando Html estático al navegador ya que es esto lo que interpreta y no los controles ASP.NET que verás más adelante.

<div>

<html>

<head>

<title>This is a static page</title>

</head>

<body>

<h1>Hello world</h1>

<table border="1" width="50%">

<tr> <th>Name</th>   <th>Age</th> </tr>

<tr> <td>Emily</td>  <td>4</td>   </tr>

<tr> <td>Thomas</td> <td>4</td>   </tr>

</table>

</body>

</html>

Añadir código de cliente

Esta técnica es la utilizada por las aplicaciones web para poder realizar tareas dinámicas en el cliente, es el navegador quien realiza el trabajo liberando así al servidor. El lenguaje por excelencia utilizado para el código de cliente es el Javascript. En ASP.NET verás que muchas de las funcionalidades que nos prestan los controles se convierten en acciones Javascript que se ejecutan al cliente.

<div>

<html>

<head>

<script language="javascript">

function displayValue()

{

alert("You entered: " + document.form1.text1.value);

}

</script>

</head>

<body>

<form name="form1">

<input type="text" size="10" name="text1" />

<input type="button" value="Click Me!" onclick="displayValue();" />

</form>

</body>

</html>

</div>

Se suele utilizar Javascript para validar datos en el cliente antes de ser enviadas al servidor, para realizar efectos en la interfaz gráfica y para realizar Ajax. Ha evolucionado mucho el concepto del código en cliente hasta al punto de existir Frameworks galardonados por la comunidad como son JQuery, MooTools, Dojo y muchos más. JQuery ha sido introducido por Microsoft en las aplicaciones web del .Net 4.

Proceso en el servidor

El proceso en el servidor te permite crear páginas dinámicamente, lo que son ASPX por ASP.NET. Son páginas que necesitan del Framework para poder ejecutarse y generar el contenido Html necesario para que el navegador pueda renderizar el contenido.

Las páginas estáticas anteriormente comentadas solo necesitan un servidor de páginas web como es el IIS de Microsoft que se encuentra en sus sistemas operativos para poder ser entregada al cliente. Las páginas dinámicas como son las .aspx de ASP.NET, .php de PHP, .jsp de Java, necesitan aparte del IIS el Framework que permita la compilación si es necesaria y la posterior ejecución del código asociado a la página dinámica.

Este código asociado es el que te permite si es necesario poderte conectar con servidores de bases de datos, servicios web para poder recuperar la información en tiempo real que te está pidiendo el cliente.

Formularios y proceso en el servidor

 

Formularios

Los formularios te permiten enviar información al servidor para que esta la pueda procesar. Un formulario es el cuerpo principal de todas las páginas aspx de ASP.NET, las denominadas Web Forms.

La etiqueta Html del formulario es el Form. Esta etiqueta tiene unos atributos que vale la pena comentar:

  • Action : Define la página que recibirá el contenido del formulario. En Web Forms este atributo es por defecto la misma página que tiene el formulario.
  • Method : Define el método Http que vas a utilizar para enviar el contenido. Existen dos que son los más utilizados en la web: GET y POST. Este atributo en los Web Forms es por defecto el POST.

En los formularios se puede enviar elementos de entrada como campos de texto, checkboxes, radio-buttons, botones, listas y otros.

 

Métodos

Tal y como he comentado existen dos métodos principales en el momento de enviar el formulario al servidor: Get y Post.

Para los dos el formato con el que se envía la información es la misma: campo=valor separando cada campo con el símbolo ‘&’.

Las diferencias básicas las encuentras en:

  • Get: Utiliza la Url para enviar la información. Por tanto puede  ser guardado en los favoritos de los navegadores pero tiene una longitud limitada. El estándar HTTP 1.1 que puedes leer en http://www.w3.org no indica ningún tipo de limitación, son los navegadores que lo imponen, en el caso del IE8 está en 2083 caracteres.
  • Post: La información se envía adjunto a la petición como si se tratara de un fichero. No existe ninguna limitación en la longitud y queda oculto al usuario, por tanto, no se puede guardar en favoritos.

Proceso en el servidor

Procesar en el servidor te permite dar contenido dinámico al usuario. Contenido dinámico significa que puedes determinar cual es la información que quiere ver el usuario en función a las entradas que te ha indicado en los formularios.

La primera solución que había para poder generar código en el servidor era CGI (Common Gateway Interface), era ejecutar un programa externo que leía las peticiones y su cabecera y generaba una respuesta.

Después apareció lo que llamamos el ‘scripting’, código anidado en las páginas Html que el servidor era capaz de ejecutar antes de enviar la página de respuesta. Aquí es donde encuentras ASP. Tecnología anterior a ASP.NET.

 

 

Más cosas en la tercera parte de este post.
Gracias

Aspectos fundamentales de la programación ASP.NET (1era parte)

Por que es tan popular la Web?

La web es fácil de utilizar. Todos hemos utilizado un navegador para conectarnos a páginas web sin problemas y hemos interactuado con ellas. Al poco rato somos capaces de pedir al navegador que queremos ver más páginas, que podemos enviar datos o incluso subir ficheros. Después nos damos cuenta que la información que estábamos mirando en un ordenador de la biblioteca también es accesible des de casa con otro ordenador e incluso con otro navegador. La web hace posible que sus páginas puedan ser vistas por cualquier navegador que interprete el HTML.

El HTML es el lenguaje de la web, el lenguaje que interpretan los navegadores y que hace que puedas visualizar texto, imágenes, videos, enlaces y formularios.

Al principio se nos enseña que existen unos buscadores capaces de buscar las páginas que tienen información de lo que queremos, después nos damos cuenta de que las páginas están asociadas a una dirección web, una dirección URL. No se nos muestra que en realidad estamos accediendo a un ordenador que tiene una IP asociada, la verdad, los servidores DNS son los olvidados de la web, nadie se acuerda de ellos, nadie sabe de ellos, solo son protagonistas cuando cae uno y de forma misteriosa no podemos acceder a la web. Poca gente sabe que podríamos acceder también mediante su dirección IP.

Es cuando vemos por primera vez una URL que nos damos cuenta que tiene un prefijo igual para todas las URL’s; el HTTP, este protocolo de comunicación que ha dado muy buenos resultados precisamente por no querer hacer demasiadas cosas, es decir, el HTTP es una comunicación simple, sin estado. Sin estado significa que la web no tiene memoria, somos nosotros en cada clic que hacemos en las páginas que estamos refrescando la memoria a la web. Este aspecto que lo verás en el capítulo 11 de este libro es muy importante para entender muchas de las cosas que hace ASP.NET para nosotros.

Al principio la web era texto, después se añadieron las imágenes y ahora los videos. Como puedes ver se ha convertido en un protocolo potente de comunicación mundial donde no importa donde estás y que ordenador tienes, solo necesitas un navegador web y una buena conexión ADSL.

HyperText Transfer Protocol

Entender el protocolo es el primer paso para entender la tecnología web y a su vez las aplicaciones web.

El protocolo es:

  • Simple: Tiene una petición y una respuesta
  • Sin estado: Cada petición es independiente de las otras

Una forma de entender el protocolo es mediante la siguiente imagen donde vemos como un cliente realiza una petición al servidor. La petición es una Request y la clase que representa  una petición en .Net es la HttpRequest. La respuesta es una Response y la clase que representa una respuesta en .Net es la HttpResponse.

http

Como ya puedes ver la petición entre otras cosas indica cual es el recurso que quieres del servidor. En el caso del ejemplo es una petición a la página page.aspx que se encuentra en la carpeta folder.

La respuesta es siempre un código y el contenido de la petición. Los códigos de las respuestas siguen la tabla siguiente:

Status Code Tipo Descripción
1xx  Información Petición recibida
2xx  Éxito La acción se ha recibido   con éxito y aceptada
3xx  Redirección Otra acción se debe   realizar para completar la petición
4xx  Error de cliente La petición   contiene errores o no puede ser entendida
5xx  Error de servidor El servidor ha   producido un error en la petición de cliente
Más cosas en la segunda parte de este post.
Gracias

Ejecución de una página ASP.NET

aspdotnet

Parte fundamental para entender como funciona ASP.NET y como puede afectar esto a tu forma de programar tus aplicaciones web. ASP.NET se planteó que la programación fuera “Event driven” que significa que cada página genera eventos. Entender cual es el orden de generación de los eventos es esencial para programar correctamente. Para verlo hablamos del ciclo de vida de la página.

Cuando llega una petición :

Construir el árbol de controles

Verás que las páginas en ASP.NET utilizan controles de servidor y esos controles están ordenados en forma de árbol tal y como ya pasa en las aplicaciones Winforms.

Evento Init

El primer evento que se ejecuta en una página es el Init. Tienes creados los controles pero estos aún no tienen los valores.

Cargar el estado y los datos recibidos

Aquí es donde se guardan los datos en los controles. En el caso que la petición sea un submit de un formulario previamente enviado también se guardaran estos valores nuevos.

Evento Load

El evento más comúnmente utilizado. Es donde tienes acceso a los valores en los controles. Aquí es importante no hacer inicializaciones sin antes comprobar que no se está realizando una petición Postback. Postback es la forma que tenemos para llamar las peticiones que envían información al servidor. Es decir, las llamadas creadas mediante una acción del usuario. No son Postback cuando la petición es directa mediante la barra de navegación del explorador o mediante un link simple (etiqueta a) de la página.

Evento acción del usuario / evento cambios en controles

Si se trata de una petición Postback quiere decir que el usuario ha realizado una acción, como por ejemplo el clic de un botón, esta acción es un evento que se debe tratar. También pueden ocurrir otros eventos que no tienen por que ser acciones de botones. Pueden ser eventos producidos por el cambio en una lista, el cambio en un texto. Este tipo de eventos también se tratan.

Evento LoadComplete

El evento anterior a procesar la página para su entrega al cliente.

Guardar el estado

Una de las características del ASP.NET es la utilización en cada página de una variable de estado denominada ViewState que permite recuperar el estado en que se ha enviado inicialmente la página. Fíjate que sin el ViewState no podrías saber que eventos de modificación se han producido.

Renderizar los controles

Otra característica de ASP.NET es la utilización de controles de servidor. Estos controles se caracterizan por empezar en “asp:”, tener un ID y un runat=”server”. Estos controles no pueden ser interpretados por ningún navegador ya que ellos solo interpretan Html. Por eso antes de enviar necesitas transformar los controles de servidor en Html.

Evento Unload

Ultimo evento en el ciclo. Se pueden liberar recursos ocupados en el proceso.

 

Para más información puedes comprar mi libro Guia Práctica de Asp.net

 

Más información:

Información general sobre el ciclo de vida de una página ASP.NET

Aspnetdb a Windows Azure

HIDDEN_264_6503_FOTO_windows-azure-logo

El meu ultim post ja et parlava de que últimament estic treballant amb Windows Azure. Avui aprofito per explicar com ho podem fer per implementar ASP.NET Membership a Windows Azure.

Com ja segurament saps una de les coses que necessitem és les taules de la base de dades aspnetdb a la base de dades que hem creat Azure.

Una de les maneres més senzilles és descarregar-te els scripts des de la web de Microsoft que et poso a sota d’aquestes linies i amb el SQL Server Managment Studio executarlos per tal de que s’ens creein les taules dins d’una base de dades existent o una de nova.

http://archive.msdn.microsoft.com/KB2006191/Release/ProjectReleases.aspx?ReleaseId=3539

Després d’això ja podem publicar la web o el servei web assegurant que les cadenes de conexió estan ben definides en el web.config

Tens més informació aqui:

Deploying your Database to SQL Azure (and using ASP.Net Membership with it)

Step-by-step: Migrating ASP.NET Application to Windows Azure (Part 2–Preparing SQL Azure Database)