domingo, 7 de junio de 2009

Programación de módulos para IIS7 (II de IV)

Programación de módulos para IIS7 (I de IV)
Programación de módulos para IIS7 (II de IV)
Programación de módulos para IIS7 (III de IV)

En el post de hoy vamos a continuar con la cadena de post en los que voy a explicaros los aspectos básicos sobre la programación de módulos para IIS7, que comenzamos el pasado día explicando que era IIS7 y comentando el lenguaje y el entorno de programación necesarios para el desarrollo:

Programación de módulos para IIS7 (I de IV)

Tras conocer un poco mas sobre el entorno, el siguiente paso será plantearnos: ¿Qué queremos hacer con un módulo en el IIS?. Para aclararos un poco mas esta pregunta os voy a describir los dos tipos de módulos que podemos programar en IIS7:

Módulos de IIS7

En IIS7 podremos instalar 2 tipos de módulos programados por nosotros, en primer lugar podremos crear módulos gráficos, que cuentan con una interfaz gráfica para realizar configuraciones en el IIS y en segundo lugar podremos programar módulos manejadores, que crean un manejador que se encuentra en todo momento escuchando todas las peticiones que llegan al servidor y cuando interceptan una nos permiten acceder a dicha petición y modificarla a nuestro antojo.

Creación e instalación de un módulo filtrador de peticiones para IIS7

Hoy os voy ha enseñar a programar el 2º de los módulos que antes comentamos, el módulo manejador, y crearemos el ejemplo mas sencillo de módulo, que simplemente interceptará una petición web, y le devolverá al cliente que la realizó la página solicitada pero con una cadena de texto al final.

Instalaciones necesarias:

Para la implementación necesitaremos las siguientes cosas:

1. Microsoft Server 2008, Microsoft Server 2008 R2, Windows Vista o Windows 7

2. Visual Studio 2005-2008

3. IIS 7

4. Asistente para creación de módulos: IIS7 Managed Module Starter Kit que ha producido el IISTeam, y que proporcionará el esqueleto del módulo para el IIS, se puede descargar desde:

http://www.iis.net/downloads/default.aspx?tabid=34&i=1302&g=6

Construcción del módulo:

Tras haber instalado el IIS7 Managed Module Starter Kit, cuando se crea un nuevo proyecto se puede ver como se ha añadido una nueva opción:

image

La seleccionamos, le damos un nombre, una ubicación y aceptamos. Inmediatamente después se nos abrirá una ventana donde nos resumen el contenido del asistente. Hacemos doble clic en el explorador de soluciones en el fichero MyModule.cs, que modificaremos dependiendo de las necesidades que tengamos en nuestro módulo. Se nos abrirá la ventana con el código del fichero, si expandimos las partes de código minimizadas, nos aparecerá lo siguiente:

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

namespace MyIIS7Modules

{

/// <summary>

/// The module class.

/// </summary>

public class MyModule : IHttpModule

{

#region IHttpModule Members

/// <summary>

/// Initializes the module, and registers for application events.

/// </summary>

/// <param name="application">

/// The System.Web.HttpApplication instance exposing application events.

/// </param>

public void Init(HttpApplication application)

{

// register for the PreRequestHandlerExecute event:

application.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);

// TODO: add additional application event handlers here

}

/// <summary>

/// Disposes of the resources (other than memory) used by the module.

/// </summary>

public void Dispose()

{

}

#endregion

#region Module Event Handlers

public void OnPreRequestHandlerExecute(Object source, EventArgs e)

{

HttpApplication app = (HttpApplication)source;

HttpContext context = app.Context;

// TODO: implement module functionality here

}

#endregion

}

}


En este fichero debemos hacer 3 modificaciones:

1. Vaciamos todo el contenido de la función “Init”, y añadimos la siguiente línea que nos añadirá el evento manejador:

application.EndRequest += new EventHandler(application_EndRequest);

2. Eliminamos la siguiente función, que no necesitamos para nuestro módulo:

public void OnPreRequestHandlerExecute(Object source, EventArgs e)

{

HttpApplication app = (HttpApplication)source;

HttpContext context = app.Context;

// TODO: implement module functionality here

}

3. Añadimos la siguiente función. En la parte comentada que pone “AÑADIMOS NUESTRO CÓDIGO” es donde deberemos programar las acciones que realizará nuestro módulo, por ejemplo, añadir una línea nueva a todas las peticiones HTML que le llegan al servidor, filtrar su contenido, borrado de comentarios… Para este ejemplo, vamos a añadir una nueva línea de texto, que salga en todas las páginas web que devuelva nuestro servidor a los usuarios. Para ello simplemente llamamos al objeto context y le indicamos que en la respuesta añadiremos un bloque de texto:

void application_EndRequest(object sender, EventArgs e)

{

HttpApplication application = (HttpApplication)sender;

HttpContext context = application.Context;

//AÑADIMOS NUESTRO CÓDIGO

context.Response.Write(“Página modificada por el blogdecalles@blogspot.com”);

}

Una vez construido nuestro módulo debemos hacer 2 cosas:

1.) Tenemos que firmar nuestra librería .dll que hemos generado, para ello hacemos doble clic en el explorador de soluciones en la etiqueta “properties” y nos vamos a la pestaña “firma”, marcamos la casilla “firmar el ensamblado” y en seleccionar un archivo de clave de nombre seguro le damos a :

image

Le asignamos un nombre, por ejemplo, key.snk y desmarcamos la casilla de proteger con contraseña. Con esto ya tenemos nuestra .dll firmada:

image

2.) Tenemos que añadir un pequeño script, que nos enviará nuestra .dll firmada a la carpeta de ensamblados que se encuentra en la ruta C:\Windows\assembly, desde donde el IIS la recogerá para poder agregarla finalmente cómo modulo. Para ello, sin salirnos de la ventana “properties” nos vamos a la pestaña “Eventos de generación”, y en el cuadro “línea de comandos del evento posterior a la generación” incluimos el siguiente script si estáis usando Visual Studio 2005:

CALL "%VS80COMNTOOLS%\vsvars32.bat" > NULL

gacutil.exe /if "$(TargetPath)"

ó el siguiente si se está usando Visual Studio 2008:

CALL "%VS90COMNTOOLS%\vsvars32.bat" > NULL

gacutil.exe /if "$(TargetPath)"

Quedando finalmente lo siguiente:

image

Configuración del IIS:

1. Tras ejecutarse los scripts ya tendremos nuestra .dll firmada en la carpeta C:\Windows\assembly y lista para agregarla como modulo (en caso de tener la .dll aparte, bien porque la hemos generado desde otro PC o porque estamos probando una que no hemos generado nosotros, nos bastará con copiar la .dll a esta misma carpeta, seguramente tengamos que aumentar las permisos de esta carpeta antes). Tras esto nos vamos al Administrador de Internet Information Services y hacemos doble clic en el icono “módulos”:

image

Vamos a la opción “agregar modulo administrado”:

image

En tipo, en el desplegable, seleccionamos nuestro módulo, y le damos un nombre cualquiera:

image

2. Para no tener que estar reciclando el AppPool con cada petición, y que no haya problemas al actualizar nuestro módulo todas las veces que queramos, vamos a indicarle que tras cada solicitud, recicle el AppPool, para ello dentro del Administrador de Internet Information Services, nos vamos a la opción Grupos de aplicaciones, seleccionamos DefaultAppPool y pulsamos en el menú que tenemos a la derecha la opción “Reciclaje”:

image

En la ventana que se nos abre debemos marcar la casilla “Numero fijo de solicitudes” y rellenarla a 1:

image

Pulsamos siguiente y marcamos la casilla “número de solicitudes”:

image

Una vez hecho esto, si abrimos un sitio web alojado en el IIS, debería estar funcionando nuestro módulo y mostrarnos en las páginas web la línea de texto que le indicamos:

image

Espero que os haya gustado el post y que os animéis a programar vuestros propios módulos, y recordad que lo mas importante es tener una buena idea y pensar que todo es programable, solo hacen falta las fuentes de información adecuadas :), el próximo día os hablaré sobre la programación de módulos con interfaz gráfica.

2 comentarios:

Emmanuel dijo...

hola que tal, oye me ha servido mucho el post, muchas gracias, justamente estoy realizando un trabajo en la escuela sobre iis y aplicaciones para moviles,espero que pronto puedas postear la tercera parte.

Juan Antonio Calles dijo...

Me alegro mucho Emmanuel :), el jueves tengo pensado tener preparada la tercera parte del post. Estate atento.

un saludo!