IHttpModule: Antes y después de la solicitud

30. January 2010 14:23 by Oscar.SS in Desarrollo .NET, Desarrollo Web  //  Tags: ,   //   Comments (0)

La interfaz IHttpModule nos proporciona una manera simple de manejar las peticiones HTTP antes de que estas comiencen a administrarse en IIS y una vez que han sido totalmente ejecutadas y se van a devolver al cliente.

¿Porque razón querríamos actuar en la solicitud antes (y después) de que comience a administrarse? 

  • Por temas de seguridad y rendimiento. Si un usuario no tiene permisos en nuestra aplicación es mejor denegarle el acceso antes de que su solicitud comience a consumir recursos en el servidor.  Comprobamos que no tiene premisos antes del comienzo de ejecución de ninguno de los eventos del ciclo de vida de la página solicitada (o control de usuario, o servicio Web).
  • Para crear módulos estadísticos sobre las solicitudes de forma global en lugar de hacerlo para las páginas de forma individual.
  • Incluir en la respuesta a la solicitud, encabezados y pies de páginas personalizados para todas las solicitudes.
  • En general, siempre que deseemos actuar antes de que comience a ejecutarse la solicitud en el servidor y justo antes de que se envíe la respuesta al cliente.
 
 
 
La forma de implementar un módulo es muy sencilla. Solo tenemos que crear un archivo de clase, por ejemplo Modulo.cs, y implementar la interfaz IHttpModule. Los miembros de esta interfaz son solo dos. 
  • Init(). Inicializa el módulo y lo prepara para procesar la solicitud HTTP.
  • Disponse(). Elimina los recursos utilizados por el módulo.
Es evidente que la lógica de nuestro módulo deberá implementarse en el método Init(). A continuación podemos ver un sencillo ejemplo que comprueba si el usuario tiene permisos, en caso negativo es transferido a una página en la que se muestra un mensaje.
 
public class ClaseModulo : IHttpModule
{
    
public ClaseModulo(){}

    
public void Dispose() { }

    
public string NombreModulo 
    {
        
get return "MiModulo"}
    }

    
public void Init(HttpApplication aplicacion)
    {
        
/*
         * Definimos los eventos del ciclo de vida de la aplicación sobre los que vamos actuar.
         * En este caso actuamos antes del comienzo de la solicitud y cuando esta termina.
         */
        
aplicacion.BeginRequest += new EventHandler(aplicacion_BeginRequest);
        
aplicacion.EndRequest += new EventHandler(aplicacion_EndRequest);
    
}

    
private void aplicacion_BeginRequest(object sender, EventArgs e)
    {
        
//Obtenemos el contexto de aplicación de la solicitud.
        
HttpApplication Aplicacion (HttpApplication)sender;
        
HttpContext Contexto Aplicacion.Context;

        
//Obtenemos la extensión del archivo solicitado.
        
string Ruta Contexto.Request.FilePath;
        string 
Extension VirtualPathUtility.GetExtension(Ruta);

       
//Si se ha solicitado una página aspx.
        
if (Extension.Equals(".aspx"))
        {
            
//Si el usuario no tiene permisos le enviamos a la página de error.
            
if (!UserTienePermisos())
            {
                Contexto.Server.Transfer(
"Default2.aspx");
            
}
        }
    }

    
private void aplicacion_EndRequest(object sender, EventArgs e)
    {
        
//Obtenemos el contexto de aplicación de la solicitud
        
HttpApplication Aplicacion (HttpApplication)sender;
        
HttpContext Contexto Aplicacion.Context;

        
//Obtenemos el nombre del archivo solicitado.
        
string Ruta Contexto.Request.FilePath;
        string 
Extension VirtualPathUtility.GetExtension(Ruta);

        if 
(Extension.Equals(".aspx"))
        {
            
//Si el usuario no tiene permisos mostramos un mensaje al final de la solicitud.
            
if (!UserTienePermisos())
            {
                Contexto.Response.Write(
"Usted no tiene permisos");
            
}
        }
    }
}
 
Una vez codificada la lógica de nuestro módulo debemos registrarlo en el web.config para ASP.NET tenga en cuenta como tiene que manejar la solicitud.
        <system.web>
            
<httpModules>
                
<add name="MiModulo" type="ClaseModulo"/>
            </
httpModules>
        
</system.web>

Recopilación y actualización a la versión .NET 4.0

14. January 2010 22:00 by Oscar.SS in Desarrollo .NET, Desarrollo Web, Información  //  Tags: , ,   //   Comments (0)

Con motivo del cercano lanzamiento de .NET Framework 4.0, me ha dado por actualizar la información que tenía en este blog de la evolución de .NET desde la versión 1.0. Por ello me he kurrado un gráfico que creo servirá para aclarar el tema del versionado de Microsoft que ciertamente es un jaleo :-(

Y ya de paso he aprovechado para modificar un poco las páginas que podéis encontrar en el menú de la izquierda, donde pone Páginas Extra, referentes a las novedades de C# 2.0C# 3.0C# 4.0. Bueno, en realidad la última versión del lenguaje no la he incluido, aún estoy recopilando la información...sorry!!.

Aquí os dejo el gráfico (click para ampliar).

 

 

Mi idea principal con este gráfico, es dejar más clara la evolución de las tecnologías disponibles en cada versión del framework en cuando a desarrollo con ASP.NET.

Por este motivo podéis encontrar en la fila correspondiente a ASP.NET (color rojo) algunas tecnologías que se han incluido en el framework pero que en realidad no pertenecen al núcleo de ASP.NET. Pero si tienen mucho que ver con el desarrollo web en ASP.NET.

Como referencia, comentar que parte de la información la he extraido del libro de José Manuel Alarcón titulado muy acertadamente "Tecnologías ASP.NET 4.0 (Saltando desde la versión 2.0)".

Por otra parte, animo a todos a comentar cualquier cosilla que se me pase por alto o que sea de interés común incluirlo en el gráfico. 

AJAX en ASP.NET 2.0 con Web Services

10. January 2010 15:08 by Oscar.SS in Desarrollo Web  //  Tags:   //   Comments (2)

Para terminar con esta serie ( IIIIIIIV y ahora V) de las posibilidades que nos ofrece ASP.NET y AJAX, vamos a ver como realizar una llamada asíncrona al servidor a través de un servicio web.

Conceptualmente no se diferencia en nada de otras versiones de ASP.NET. Configurando convenientemente el servicio web podremos llamar a este desde un script de cliente y todo de forma asíncrona. Con ASP.NET 2.0, como siempre, nos ayudará en esta tarea el control ScriptManager.

 

 
 
 
Código Cliente
 
En primer lugar debemos registrar por medio del ScriptManager el servicio web y también como ya es costumbre el script donde se encuentra el código que realiza la llamada.
    <asp:ScriptManager ID="ScriptManager1" runat="server">
        
<Services>
            
<asp:ServiceReference Path="ServicioWeb.asmx" />
        </
Services>
        
<Scripts>
            
<asp:ScriptReference Path="funcionesWebService.js" />
        </
Scripts>
    
</asp:ScriptManager>

En el archivo funcionesWebService.js como ya hemos comentado se encuentra el código que envía los datos al servidor y también los recoge y manipula. A estas alturas este código, con tres funciones, una para enviar datos, otra para recogelos y la última en caso de error durante el proceso asíncrono, es de sobra conocido por todos.

//Funcion que llama al servicio web de forma asíncrona.
function EnviarDatos() {

    
//$get('') == document.getElementById('')
    
var nombreSeleccionado $get("listaNombres").value;

    
//Llamada al servicio web.
    
ServicioWeb.ObtenerDatos(nombreSeleccionado, RecogerRespuesta, RecogerErrores)
}


//Funcion que recoge los datos desde el servidor.
function RecogerRespuesta(datosRecibidos) {

    $
get("txRespuesta").innerText datosRecibidos;
}


//Función que recoge los posibles errores.
function RecogerErrores(error) {

    
alert("Error: " + error.get_message());
}

 

Código Servidor

En el archivo de código de nuestro servicio web debemos implementar el método que recibirá la petición del cliente y después de hacer las operaciones oportunas devolverá los datos al script de cliente.

[System.Web.Script.Services.ScriptService]
public class ServicioWeb : System.Web.Services.WebService 
{

    
public ServicioWeb () 
    {}


    [WebMethod]
    
public string ObtenerDatos(string nombreSelect) {

        
string ruta Server.MapPath("~/App_Data/datos.xml");

        
//Antes de enviar la petición simulamos una tarea larga.
        
System.Threading.Thread.Sleep(5000);

        return 
ManejarDatos.ObtenerCategoria(nombreSelect, ruta);
    
}
    
}

Como vemos hemos decorado la clase del servicio web con el atributo System.Web.Script.Services.ScriptService, de esta forma indicamos que la clase contiene servicios que serán utilizados mediante script de cliente. También hemos, al igual que con los Page Methods, decorado el método que recibe la llamada AJAX con el atributo System.Web.Services.WebMethod para indicar que se pretende exponer este métedo como parte del servicio web.

 

Código de descarga 

El código completo mencionado en este artículo se encuentra en la carpeta AJAX_NET_3.5/Retro_Llamadas/AJAX_WebService del siquiente enlace. Para probar la aplicación ejecutar la página Default.aspx de la carpeta mencionada.

 

AJAX_ASP.NET.rar (15,45 kb)

12 millones de euros...¡Quien parte y reparte, se lleva la mejor parte!

5. January 2010 12:53 by Oscar.SS in Personal  //  Tags:   //   Comments (4)

Al margen de la política o del gobierno de turno  (me da lo mismo si el que esta arriba tiene bigote, se parece a Mr. Bean o babea cuando habla) quiero hacer eco de la desfachatez de presentar un proyecto web como es la página oficial de la presidencia española europea por el módico precio de casi 12 millones de euros.

Como seguramente ya sabéis, estos días se ha publicado por toda la red el hackeo de la web de la presidencia. Algún listillo (con todos mis respetos) supuestamente subió una imagen de Mr. Bean a los servidores de la web.

 

 

 

En realidad, no han hackeado los servidores, no han accedido a ellos ni han subido ninguna imagen. Simplemente han inyectado algo de código (una query) en un campo de texto y han conseguido en el cliente del listillo (otra vez mis respetos) cargar esta imagen. Esta mejor explicado aquí. De todas formas es un error gravísimo y de ninguna manera aceptable en una solución profesional.

Aclarado este asunto. Veamos un poco en que se han invertido 12 millones de euros.

 

Contratación de dominios

Lo normal en este caso sería comprar todas las extensiones de dominos, o por lo menos las más importantes si andamos cortos de presupuesto como en este caso :-), para evitar que alguién pueda poner un contenido que nada tiene que ver con el nuestro con una URI que solo se diferencia en la extensión. Veamos unos ejemplos:

http://www.eu2010.com/

http://www.eu2010.org/

http://www.eu2010.info/

¡¡Y este es mi favorito!!, http://www.eu2010.eu/

 

Diseño de la página

Lo cierto es que yo (como casi todos los desarrolladores) no estoy dotado de mucha sensibilidad artística, es decir, que soy nulo para el diseño. Pero si se cuando me gusta algo, si se cuando una web tiene un diseño agradable, innovador o por lo menos decente.

Solo con entrar en la web y mirarla durante unos segundos basta para quedarse indiferente y decepcionado. Sinderamente, con este presupuesto me esperaba mucho más.

 

Escalabilidad

Durante toda la mañana la web funciona a paso de burro, esta practicamente "petada". Se conoce que por toda la publicidad que se le ha dado al supuesto hackeo, estamos todos entrando como borregos para encontrar fallos, o por simple curiosidad.

Cierto es que tener un buen rendimiento cuando se gestionan grandes volúmenes de visitas es un tema muy complejo, pero otra vez me esperaba más con este presupuesto. Supongo que con el tiempo lo solucionarán.

 

Funcionalidad, compatibilidad, calidad, pruebas, etc

Lo primero que llama la atención al entrar en la página es el calendario. Toda la página está en castellano pero no han traducido el calendario (en el momento de escribir este artículo esta en ingles). Cuando cambiamos de idioma, por ejemplo al Catalan, si está traducido. Pero lo encontramos en ingles otra vez al poner como idioma el Euskera.

En el menú horizontal nos encontramos tres cutres aes para cambiar el tamaño de la fuente en los contenidos. Si lo pruebas con Chrome funciona perfectamente, en IE 6.0 se descuadran todos los contenidos, en IE 8.0 al aumentar el contenido se sale de la pantalla y no se muestra el necesario scroll y en la última versión de FireFox ni siquiera funciona el JavaScript.

  

Es cierto que son fallos muy comunes y que nos encontramos en muchas web (incluidas en las que yo participo) pero ninguna de ellas con un presupuesto de 12 millonazos de euros. ¡Que verguenza!.

En el pie de página tenemos varios enlaces, condiciones generalespolitica privacidadaviso seguridad, y accesibilidad  que o no funcionan correctamente (sobre pasa el tiempo de espera de la respuesta del servidor) o simplemente no carga el contenido que pretenden tener, ¿se le habrá olvidado a álguien?.

Al parecer la página esta desarrollada sobre un OpenCMS en Java ;-), lo que podría justificar un poco la falta de elasticidad a la hora de implementar ciertas funcionalidades pero en ningún caso los errores mencionados. Aquí tenéis una web muchísimo, pero muchísimo, más barata y mejor implementada con otro OpenCMS en la que han participado tan sólo un programador, un analista y un jefe de proyecto. ¿Por qué se esto?, porque han sido mis compañeros los que la han desarrollado.

 

Las Cifras y los implicados 

Para ser del todo sinceros y veraces, algunos medios en la web defienden que el desarrollo en sí del proyecto no ha costado 12 millones, es decir, que solo una parte (excesiva parte de todos modos) se ha destinado al desarrollo. Pero la adjudicación oficial del contrato público no parece indicar lo anterior. Aún así, con las cifras que se manejan, por ejemplo, 147.900 euros de traducción665.778 euros en asistencia técnica de redacción y documentación, etc...son como para desconfiar.

Vamos que desde arriba hacia abajo, Gobierno, Telefónica, Informática el Corte Ingles y todos los intermedirarios...¡a saber que ha pasado para manejar estas cifras!.

Desde luego, quiero dejar claro que nadie critica el trabajo del equipo de desarrollo de esta web. Al contrario, los errores comentados, por desgracia, son de lo más habitual en el mundo del desarrollo web.

A saber en que condiciones han trabajado esta pobre gente. Con presiones, con plazos mal previstos, con escasos recursos...¡vete tu a saber!. Pero tengo claro que seguramente no ha sido nada agradable para ellos este proyecto. Además desde que salto la alarma en los medios del supuesto hackeo me los imagino a los pobres trabajando hasta las 12 de la noche sin comer y con miedo de que rueden cabezas. 

 

Resumiendo

Que independientemente del presupuesto del proyecto me esperaba mucho más de una web que nos representa a todos los españoles ante europa (y el mundo). Y que sin miedo ha equivocarme, el presupuesto esta sobre estimado muy por encima...¡¡ezto pati y ezto pami que pa ezo semos españoles!!.

Como siempre dice con pesar y desánimo un buen compañero mio...¡que país! ;-)

Recent Comments

Comment RSS

Month List