La palabra clave ‘using’, esa gran desconocida

Bueno, en realidad a mi no me parece que debiera ser tan desconocida. Sin embargo me encuentro continuamente con personas que no saben para que se usa o, más a menudo, que la confunden con el using de inclusión de un espacio de nombres que aparece en la parte de arriba de los archivos C#.


De hecho, una de las preguntas de test que hacemos a los candidatos para acceder a un puesto de programador en Krasis es precisamente: ¿Para qué vale la palabra clave ‘using’ tanto en C# como en VB? Y casi nadie la contesta bien, cosa que a mi me sorprende mucho. Lo que he subrayado en la pregunta anterior es lo que, en caso de duda, debería dar la pista ya que la sentencia de inclusión de espacios de nombres en VB es ‘Imports’, no ‘using’ como en C#, así que sólo queda la otra opción…


El objetivo de la cláusula using (en C#) o Using en VB es el de asegurar que los recursos asociados a un determinado objeto se liberan siempre, es decir, se emplea para asegurar que al acabar de usarlo siempre se llama al método Dispose() del objeto que referenciamos dentro de la declaración de using.


Traducido al cristiano veamos su utilidad en una situación muy común, por ejemplo, un acceso a base de datos.


Supongamos el siguiente código muy habitual (en C#, pero en VB sería casi idéntico):


using System.Data; //Este es el using de importación de espacio de nombres, que no es el que nos interesa
using System.Data.SqlClient;

SqlConnection conn = new SqlConnection();
try
{
   //Aquí hacemos algo con la conexión
}
finally
{
   conn.Close();
}


Es decir, abrimos una conexión, dentro del bloque try lanzamos una consulta o varias, etc.. El bloque finally se ha incluido para asegurarnos de que la conexión se cierra aunque se produzca un error en nuestro bloque de procesamiento, ya que de otro modo quedaría abierta y no se podría recuperar, disminuyendo la escalabilidad de nuestro programa. De hecho, el modo adecuado de hacer esto aún sería más complicado ya que la cláusula finally que he escrito da por hecho que la conexión está abierta y la cierra, pero si ya estuviese cerrada se produciría una excepción. Así que en un código real tendríamos que comprobar antes el estado de la conexión y luego llamar a Close(). En fin, una pesadez pero la única forma buena de hacerlo…. y de hecho me consta que muchos programadores ni siquiera lo tienen en cuenta. ¡Grave error!


Para evitarnos el tedio de escribir lo anterior pero aún así cerciorarnos de que la conexión se cierra podríamos emplear la cláusula using de la siguiente manera:


using System.Data; //Este es el using de importación de espacio de nombres, que no es el que nos interesa
using System.Data.SqlClient;

using(SqlConnection conn = new SqlConnection())
{
   //Aquí hacemos algo con la conexión
}


Esto es equivalente a todo lo que comentaba en el párrafo anterior. Es decir, el ‘using’ se cerciora de que, al acabar el bloque de código entre sus llaves, aunque haya un error, se llama al método Dispose() del objeto conn  que hemos declarado en su bloque inicial. Este método Dispose() es el que se cerciora de que los recursos de la conexión se liberen adecuadamente, incluyendo el cierre de la conexión.


Con using nos aseguramos de que nuestra aplicación no va dejando por ahí recursos mal liberados y el código queda mucho más compacto y fácil de leer, además de que no nos tenemos que preocupar de hacer la liberación de la manera adecuada ni de comprobar cosas como que una conexión está abierta antes de intentar cerrarla.


Por supuesto no tenemos porqué usarlo sólo para conexiones Cualquier objeto cuyos recursos debamos liberar es candidato a ‘using’, por ejemplo objetos de GDI+ (como pinceles, brochas y demás..), recursos de transacciones (los nuevos objetos TransactionScope de .NET 2.0), etc…


Aprendamos a sacarle provecho ya que su funcionalidad es fundamental para crear aplicaciones escalables y que hagan un uso racional de los recursos del sistema.

Las versiones Express de Visual studio serán gratuitas para siempre


Con la reciente versión 2005 de Visual Studio y SQL Server, Microsoft lanzó unas versiones específicas dirigidas a desarrolladores individuales denominadas Express, que se ofrecían sin coste alguno por un tiempo limitado.


Ante el éxito de la herramienta (más de 5 millones de descargas), el pasado miércoles día 19 de abril Microsoft ha anunciado que las herramientas serán gratis para siempre.


LegoAdemás, el gigante informático ha estado trabajando con diversos fabricantes para ofrecer a los desarrolladores diversas APIs que s epuedan usar desde las versiones Express para hacer cosas muy interesantes. En la misma página del anuncio se muestran muchos de ellos, entre los que destacan:



· Kit para Lego Mindstorms
· Envoltorio para la API de Skype
· Kit para planificación de rutas
· Starter Kit de portal de anuncios clasificados
· Starter Kit de gstión de la docencia, para gestionar una pequeña academia.
· Estupendo juego en 3D, Rocket Commander, para aprender a crear este tipo de programas.


(Descargar toolkits gratuitos de versiones Express)


Las ediciones Express de Visual C#, Visual Basic, Visual C++, Visual J#, Visual Web Developer y  SQL Server se pueden descargar grátis desde la página de Visual Studio Express.


Service Pack 1 de SQL Server 2005


Además Microsoft ha anunciado la disponibilidad del primer Service Pack de SQL Server 2005, en tan sólo 5 meses.


Se trata más de un añadido que de un parche puesto que aunque soluciona alrededor de 40 bugs, realmente lo más interesante es que agrega varias funcionalidades, como algunas herramientas nuevas para los servicios de informes. De todos modos lo más interesante es que con esta actualización por fin está terminada la tecnología de Database Mirroring que permite duplicar bases de datos en tiempo real, así como una tecnología peer-to-peer destinada a a realizar replicaciones de transacciones.


Se puede descargar gratuitamente desde la página de descarga del SP1 de SQL Server 2005. Por supuesto está también castellano.


(Noticia procedente del boletín de campusMVP).

Sencillo modo de mantenimiento en aplicaciones Web con ASP.NET 2.0

Esta características es muy poco conocida pero realmente útil.


Más pronto que tarde, una vez que tenemos en producción una aplicación Web, toca hacer mantenimiento. Ello implica muchas veces retoques sencillos que no interfieren en el trabajo normal de ésta, pero en ocasiones hay que hacer cambios gordos (por ejemplo cambiar la estructura de la base de datos o montar un módulo nuevo completo). En estos casos es conveniente detener la aplicación.


Lo típico en esta situación es colocar un archivo default.htm que sea el primero al que se dirijan los usuarios cuando entren en la aplicación. Sin embargo no sirve de mucho. Para empezar los usuarios que ya estén con la aplicación en marcha seguirán trabajando con ella como si nada. Además los ensamblados de la aplicación seguirán en memoria, las bases de datos de SQL Server 2005 Express que se hayan adjuntado dinámicamente seguirán bloqueadas y los que hayan guardado en favoritos el acceso directo a la página correcta (que no será default.htm) o que se sepan la URL adecuada seguirán teniendo acceso a la aplicación.


Otra opción es parar el servidor virtual en IIS y activar otro que responda al mismo dominio y que contenga una nota de mantenimiento. Lo malo es que esto es tedioso, necesitamos acceso a administrar el servidor (cosa que no tendremos en un hosting compartido, por ejemplo), y si el servidor virtual responde a varios dominios tendremos que tener las cabeceras de host duplicadas en el servidor virtual para mantenimiento. Vamos, que no es una opción en la mayor parte de los casos…


App_Offline.htm


Por suerte ASP.NET 2.0 ofrece un atajo sencillo para todo esto. Se trata de crear un archivo llamado App_Offline.htm y colocarlo en la raíz de nuestra aplicación.


Siempre que ASP.NET 2.0 detecte la existencia de este archivo en el raíz, cerrará la aplicación, descargará el dominio de aplicación de la memoria del servidor y desbloqueará las bases de datos adjuntadas dinámicamente. Además, cualquier petición que llegue a nuestra aplicación, sea de usuarios nuevos o de gente que ya la estuviese usando, obtendrá como respuesta el contenido de ese archivo que normalmente contendrá un mensaje de «Página en mantenimiento».


Se trata de un modo sencillo y conveniente de poner la aplicación en mantenimiento.


Consideraciones de seguridad


Claro que no todo va a ser maravilloso. Esto puede suponer un peligro de seguridad (por denegación de servicio) en el caso de aplicaciones mal programadas. Si permitimos que los usuarios suban archivos al servidor y no tenemos el tema bien controlado (algo más común de lo que nos creemos), alguien podría copiar un archivo con ese nombre al raíz y echarnos abajo la aplicación, así que mucho cuidado.


Desde mi punto de vista hubiera sido más adcuado que este modo de mantenimiento se activase mediante una entrada en el archivo web.config, que sería algo mucho más seguro.


De todos modos no hay queja 🙂

Disponible el código fuente de todos los proveedores nativos de ASP.NET 2.0

Estupenda noticia para todos los programadores de ASP.NET 2.0…


El equipo de ASP.NET liberó el pasado día 13 de abril (Jueves Santo para mas señas), el código fuente de los proveedores incluidos en ASP.NET 2.0, es decir:



· Membership: para gestión de usuarios y autenticación.
· Roles: gestión de la pertenencia a roles de los usuarios.
· Site navigation: navegación por el sitio Web a partir de archivos XML.
· Profile: almacenamiento y gestión de las preferencias de los usuarios.
· Web Part personalization: personalización de los Web Parts.
· Web events: se trata de un marco de desarrollo para emitir eventos en tiempo de ejecución para señalizar e informar todas aquellas situaciones que puedan ser relevantes: errores, desempeño, rendimiento, etc…
· Session State: persistencia de objetos de sesión.


Se trata de un código interesante y que además nos puede servir de base para crear nuestros propios proveedores de manera todavía más fácil.


La licencia es muy abierta y permite usar el código tanto en aplicaciones comerciales como no comerciales.


Y por si esto a alguien le parece poco, Jeff  Prosise se ha encargado de documentar este código por completo, detallando cómo está hecho y cómo funciona:



El código fuente se puede descargar desde aquí.


Noticia extraída del boletín de campusMVP.

AJAX (y VII): Posibles problemas ( y IV) – Problemas y beneficios de las cachés

Para terminar voy a comentar algo sobre las cachés…


Cuando envías una petición AJAX (o no AJAX) al servidor es posible que si la caché del lado servidor no esté corrrectamente configurada el navegador realice su propia caché y por lo tanto la llamada no llegue al servidor jamás. Eso puede ser estupendo (muchas veces es lo que querremos para ahorrar procesamiento) y otras puede ser una maldición ya que no obtendremos los datos actualizados.


Otra cosa a tener en cuenta es que algunos proveedores utilizan en su red dispositivos proxy-caché que no están bajo nuestro control. Éstos no funcionan todo lo bien que debieran o al menos no respetan las configuraciones de servidor como es debido y hay veces que las peticiones se pierden en el Limbo de los justos.


A la hora de enviar datos por POST como hemos visto en el post anterior, no hay problema. El verdadero problema está en las peticiones GET, por otro lado las más habituales.


Si el servidor tiene bien configurada la caché (es decir, indica cuándo caducan los contenidos o marcamos en IIS que éstos caduquen inmediatamente) no deberíamos experimentar fallos, salvando lo comentado respecto a los proxy-caché de algunos proveedores.


Si queremos asegurarnos de que la petición va a llegar a su destino podemos hacer fundamentalmente dos cosas:


1.- Agregar una cabecera que indique que se debe obtener el contenido siempre que éste sea posterior a una fecha antigua, por ejemplo así:



http.setRequestHeader(‘If-Modified-Since’, ‘Wed, 1 Jan 2003 00:00:00 GMT’);


2.- Añadir un número aleatorio (o cadena) a la URL de cada petición.


Suele funcionar muy bien el agregarle una marca temporal, es decir, añadir a continuación la fehca y hora actuales, de modo que cada una de las peticiones que se hagan va a ser diferente y por lo tanto los caché que existan por el medio tienen que repetir siempre la petición. Por ejemplo:



http.open(«POST», «http://www.miserv.com/misdatos.aspx?pasacache=» + new Date().getTime(), true)


Se le añade un parámetro que lleva como valor la fecha y hora en formato numérico (es decir, un número muy largo y que varía varias veces cada milisegundo), por lo que es muy difícil que se den dos peticiones idénticas incluso a través de un proxy-caché. Además ese parámetro extra de nombre inventado que nosotros le añadimos no debería afectar en absoluto a la llamada puesto que no está siendo tenido en cuenta por la aplicación.


Esta segunda técnica es, para mi, la más recomendable, aunque tal vez sea un poco más tediosa de implementar.


————–


Con esta séptima entrega acabo la mini-serie sobre AJAX «a pelo». Posteriormente me gustaría continuarla con técnicas AJAX que no incluyan el uso directo de XmlHttpRequest sinoque utilicen bibliotecas o técnicas específicas, centrándome especialmente en ASP.NET.


¡Sigue atento a este blog! 🙂

AJAX (VI): Posibles problemas (III) – Envío de información grande

En esta tercera parte (sexta de la serie) dedicada a los problemas/desafíos relacionados con AJAX vamos a tratar el envío de datos al servidor.


Normalmente cuando pensamos en AJAX, es decir, en llamadas asíncronas a servicios, lo hacemos desde el punto de vista de obtener información: llamo a una página que me devuelve unos valores y los muestro en la interfaz de usuario. Aunque este es el uso más común de AJAX lo cierto es que también es muy útil usarlo en el sentido inverso, para enviar datos al servidor. Las utilidades y necesidades que cubre son múltiples y de hecho hay muchos sistemas. Por ejemplo, las plataformas de teleformación como nuestro SELF, lo usan para la parte de comunicación entre contenidos y plataforma de la especificación SCORM.


la forma más sencilla y directa de enviar datos simples al servidor es incluirlos en la URL a la que llamamos como parámetros GET:



urldestino.aspx?Parametro1=1234&Parametro2=5


Aunque esto puede servirnos para cosas muy sencillas no es a lo que me refería al principio de este post.


Lo habitual es que la información haya que enviarla con el método POST. La principal diferencia entre GET y POST estriba en que el método GET hace una sola llamada al servidor, solicitando una página y enviando algunos parámetros de datos en la propia petición. POST por el contrario realiza dos conexiones al servidor. en la primera solicita una URL y en la segunda envía los datos. POr GET lo máximo que se puede enviar son 2 kB de información, mientras que por POST no existe esta limitación.


Para enviar datos al servidor mediante POST nuestro código AJAX sería similar al siguiente:



http = getHttpRequest()
http.onreadystatechange = finCarga;
http.open(«POST», «http://www.miserv.com/misdatos.aspx», true)
http.send(‘Parametro1=1234&Parametro2=5’);


Con esto no hemos ganado demasiado. Ahora se envían  los datos por POST (sólo cambia elprimer parámetro de open) pero los hemos tenido que introducir en el método send en lugar de en la propia URL. Esto sólo simularía el envío de parámetros meidante POST desde un formulario HTML (que por otro lado en ocasiones puede ser lo que queramos).


Lo habitual sin embargo es que en lugar de enviar parámetros querramoe enviar información pura y dura, del tamaño que queramos, que es para lo que suele usarse POST. Esto se puede conseguir modificando ligeramente el código anterior para incluir una cabecera que indique al servidor que lo que le llega son, precisamente, datos:



http = getHttpRequest()
http.onreadystatechange = finCarga;
http.setRequestHeader(‘content-type’, ‘application/x-www-form-urlencoded’);
http.open(«POST», «http://www.miserv.com/misdatos.aspx», true)
http.send(‘Aquí ahora mando la información que quiera al servidor’);


Con esto nuestro problema queda resuelto.

AJAX (V): Posibles problemas (II) – Gestión de errores y llamadas que no vuelven

Siguiendo con la lista de problemas que dan en este tipo de aplicaciones asíncronas AJAX, nos toca analizar los posibles errores de comunicaciones que se pueden producir.


No podemos asumir que la llamadas que hagamos al servidor van a funcionar siempre. Puede haber un error en el código del servidor, puede haber cambiado la URL y no aparecer la página que llamamos, haber errores de permisos, etc… Lo que pase en el servidor está fuera de nuestro control. Ante eso hay que estar preparado. La forma de controlar estas situaciones es, como en cualquier componente de comunicaciones por HTTP, a través del código de estado que devuelva el servidor. La propiedad ‘status’ del objeto XmlHttpRequest nos proporciona esta información.


De hecho ya hemos tenido en cuenta este asunto en los ejemplos anteriores que habíamos desarrollado:



function finCarga()
{
   if (http.readyState == 4) //4: completado
   {
      if (http.status == 200) //200: OK
      {
         res = http.responseXML;
         Procesarespuesta();
      }
      else //Se produjo un error
      {
         alert(«No se pudo recuperar la información: « + http.statusText);
      }
   }
}


Como se ilustra en este código, en general, todo lo que no sea un estado devuelto de 200 lo debemos considerar un error.


Llamadas que no vuelven


Lo anterior no deja de ser bastante obvio y además fácil de solucionar (sólo es comprobar un valor). hay, sin emabrgo, una situación menos frecuente pero más peligrosa que se puede producir: que la llamada asíncrona al servidor no vuelva o no lo haga en un tiempo razonable. ¿Qué hacemos en ese caso?


No podemos contar con la notificación de final de carga puesto que, al no regresar la llamada, no saltará.


Lo que se hace en estos casos es establecer un temporizador con el tiempo máximo que deseemos esperar, para que al cabo de ese intervalo la petición sea anulada directamente, sin esperar más que llegue la respuesta:



http = getHttpRequest()
http.onreadystatechange = finCarga;
http.open(«GET», «http://www.miserv.com/misdatos.aspx», true)
var tmrAnular = setTimeout(«AnularPeticion()», 20000); //20 segundos
http.send(null);


function AnularPeticion()
{
   http.abort();
}


function finCarga()
{
   if (http.readyState == 4) //4: completado
   {
      clearTimeOut(tmrAnular);
      if (http.status == 200) //200: OK
      {
         res = http.responseXML;
         Procesarespuesta();
      }
      else //Se produjo un error
      {
         alert(«No se pudo recuperar la información: « + http.statusText);
      }
   }
}


He marcado en rojo las líneas nuevas. Lo único que se hace es crear un temporizador (en este caso de 20 segundos pero deberás ajustarlo a tus preferencias), que se encarga de anular la petición al pasar un tiempo determinado. En el evento de fin de carga se elimina el temporizador (ya no hace falta: ha vuelto ya la petición).

AJAX (IV): Posibles problemas (I) – Llamadas fuera de nuestro dominio

Con este título en dos partes continuamos con la serie dedicada a AJAX en donde se había quedado.


Los principales problemas que nos podemos encontrar al usar técnicas AJAX en nuestras aplicaciones Web son los siguientes:




  1. Llamadas fuera del dominio.


  2. Llamadas que producen errores o que no vuelven jamás.


  3. Envío de datos al servidor.


  4. Las malditas/benditas cachés.

En este post trataremos el primer problema y dejamos para los siguientes los restant.


Una vez que uno empieza a juguetear con las posibilidades de AJAX enseguida se nos ocurren ideas geniales para sacarle partido. La más obvia, claro está, es la de utilizar las técnicas para acceder desde el cliente a ciertos servicios web de utilidad ubicados en Internet que para eso están. Así, dado que los Servicios Web están basados en XML es muy fácil procesar lo que devuelven con las técnicas descritas para, por ejemplo, realizar búsquedas en Google o en Amazon con su API, enviar «posts» a nuestro blog, etc…


Otra aplicación es la de construir un lector de noticias RSS para, desde el navegador directamente, acceder a este tipo de fuentes de información sin necesidad decargar al servidor con su proceso previo.


Todo esto es estupendo pero tiene un gravísimo problema: los navegadores, por cuestiones de seguridad, bloquean todas las peticiones realizadas mediante XmlHttpRequest a dominios que no sean el que aloja la página desde la que se está usando.


En realidad se trata de una restricción bastante lógica y a la que otros entornos de programación como Flash o los Applets Java nos tienen acostumbrados de toda la vida. Pero esto, claro está, supone una limitación importante para ciertos tipos de aplicaciones AJAX que podríamos desarrollar, como las de los ejemplos comentados.


¿Cómo lo solucionamos?


Bueno, en Internet Explorer basta con bajar el nivel de seguridad para que ya funcione correctamente, pero no es una buena solución (no le puedes pedir esto a todos tus usuarios). En Firefox, Opera y safari no hay forma de hacerlo funcionar. Existe una salvedad en Firefox que consiste en firmar digitalmente el JavaScript que usas, pero tampoco vale de mucho pues sólo funcionaría en este navegador.


En fin, que estamos bastante fastidiados.


La única forma de solucionarlo de manera independiente al navegador es, obviously, hacer que no dependa de éste, es decir, llevándonoslo al servidor. Para ello lo que debemos hacer es construir un servicio Proxy que esté en nuestro servidor (al que sí podremos llamar con AJAX) y qué este se encargue de realziar la llamada a otros dominios devolviendo el resultado a nuestro JavaScript, directamente o, ya de paso, pre-procesádolo. En fin, que no nos libramos de trabajar en el lado servidor 🙁


En .NET esto implica que lo mejor es crear un manejador de peticiones con extensión .ashx que se encargue de enrutar las peticiones que nos interesen. ¡Mucho ojo con esto!. Normalmente este tipo de servicios, al igual que los que se encargan de ller archivos de disco de manera genérica y similares, son un verdadero peligro de seguridad que puede poner en peligro todo el servidor. Si haces esto lo mejor es que tomes varias precauciones de cara a la seguridad:




  • Ten muy acotados los servicios o URLs a los que se puede llamar desde tu proxy. Lo mejor es que los identifiques a cada uno con un número o código decidiendo a cuál se llama desde un switch (o Select Case en VB.NET), nunca poniendo la URL en la llamada de tu JavaScript.


  • Trata de identificar al Script llamante de alguna manera: mediante una cabecera que te debe enviar, comprobando el dominio del «referer» y cosas similares. Está claro que el que controle se puede saltar esto sin problemas pero le das más trabajo y te elimina a los aficionados que quieran hacer uso ilícito de tu servicio.


  • Si puedes limita el número máximo de llamadas seguidas que s epuede hacer desde una determinada IP o, mejor, en una determinada sesión de servidor.

Otra opción más «de andar por casa»


Si lo de escribir un proxy no te convence o no sabes cómo hacerlo bien tienes otra opción que te permite «zafar» sin ello. consiste en usar un marco interno (IFRAME) oculto. En él cargas la URL que te interese usando su propiedad src. Al ser un marco interno tienes acceso a todas las propiedades de su document, es decir, que puedes detectar cuándo ha terminado de cargar y leer sus contenidos procesándolos también mediante DOM. Funciona pero es mucho más tedioso y propenso a errores.